Подтвердить что ты не робот

Как получить доступ к "this" ссылке анонимного внешнего класса в java

У меня есть следующая проблема. Два вложенных анонимных типа. Я хочу получить доступ к "this" ссылке внешнего анонимного класса внутри самого внутреннего класса. Обычно, если у кого-то есть анонимный вложенный класс в именованном внешнем классе (позволяет называть его "класс Outer" ), он вводит внутри вложенного класса Outer.this.someMethod(). Как я могу ссылаться на внешний класс, если он анонимный? Пример кода:

public interface Outer {
    void outerMethod();
}

public interface Inner {
    void innerMethod();
}
...
public static void main(String[] args) {
...
new Outer() {
    public void outerMethod() {
        new Inner() {
            public void innerMethod() {
                Outer.this.hashCode(); // this does not work
            } // innerMethod
        }; // Inner
    } // outerMethod
}; // Outer
...
} // main

Ошибка, которую я получаю,

Нет экземпляра экземпляра типа Outer, доступного в области

Я знаю, что могу скопировать ссылку следующим образом:

final Outer outerThisCopy = this;

непосредственно перед созданием объекта Inner, а затем обратитесь к этой переменной. Реальная цель заключается в том, что я хочу сравнить хэш-коды outerThisCopy и объект, доступный внутри объекта new Inner (т.е. Outer.this) для целей отладки. У меня есть хорошие аргументы, чтобы думать, что эти два объекта различны (в моем случае). [Контекст: аргумент состоит в том, что вызов геттера, реализованного в классе "Outer", который не затенен в классе "Inner", возвращает разные объекты]

Любые идеи, как мне получить доступ к ссылке "this" в приложении анонимного типа?

Спасибо.

4b9b3361

Ответ 1

Вы не можете получить доступ к экземпляру анонимного класса непосредственно из внутреннего класса или другого анонимного класса внутри него, поскольку у анонимного класса нет имени. Однако вы можете получить ссылку на внешний класс с помощью метода:

new Outer()
{
    public Outer getOuter()
    {
        return this;
    }

    public void outerMethod()
    {
        new Inner()
        {
            public void innerMethod()
            {
                getOuter().hashCode();
            }
        };
    }
};