Как получить доступ к "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" в приложении анонимного типа?

Спасибо.

1 ответ

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

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

licensed under cc by-sa 3.0 with attribution.