Как получить доступ к "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.