Это, на самом деле, очень хороший вопрос, если, например, вам необходимо проверить, имеют ли два разных экземпляра класса Innner
один и тот же экземпляр класса Outer
(== или равно в зависимости от в контексте).
Я бы предложил создать интерфейс общего назначения (не обязательный для именованных внутренних классов, но может быть "приведен к экземпляру")
public interface InnerClass<Outer> {
Outer getOuter();
}
, который может быть применен к любому именованному внутреннему классу.
Тогда вы делаете что-то вроде:
class MyInnerClass implements InnerClass<Outer> {
Outer getOuter() {
return Outer.this;
}
// remaining implementation details
}
и таким образом вы можете получить доступ к внешнему классу из любого внутреннего класса, реализующего интерфейс InnerClass<Outer>
(и проверить, действительно ли он его реализует).
Если ваш внутренний класс анонимный, вы можете это сделать только (спасибо Rich MacDonald за образец):
new InterfaceOrAbstractClass<Outer>() {
Outer getOuter() { // super inefficient but this is the only way !
return (Outer)getClass().getDeclaredField("this$0");
}
/* other methods */
}
но InterfaceOrAbstractClass
должен реализует InnerClass<Outer>
, чтобы иметь возможность доступа к getOuter()
вне тела анонимного класса!
Было бы намного проще, если бы javac автоматически реализовывал некоторый интерфейс InnerClass<Outer>
во ВСЕХ внутренних классах, и это могло бы сделать это очень эффективно даже на анонимных классах (без медленной обработки интроспекции)!