Трюк здесь - это знание того, как работает внутренний класс. Это по существу просто «нормальный», статический класс, но конструктор неявно получает ссылку на охватывающий класс. Итак, это:
public class TopLevel {
public void go() {
new Inner().bar();
}
public void foo() { }
public class Inner {
public void bar() {
TopLevel.this.foo();
}
}
}
эквивалентно следующему:
public class TopLevel {
public void go() {
new Inner(this).bar(); // explicitly passing in "this"
}
public void foo() { }
public static class Inner {
private final TopLevel parent; // note that we have this new field
public Inner(TopLevel parent) { // note this new constructor
this.parent = parent;
}
public void bar() { // we use the explicit reference instead
parent.foo(); // of the implicit TopLevel.this
}
}
}
Так, со всем, что сказал, как реорганизовать свой внутренний класс, чтобы быть классом верхнего уровня, чтобы добавить явное поле ссылаясь на экземпляр UpperClass
и передавая эту ссылку в конструктор NestedClass
. Другими словами, будьте похожи на этот второй фрагмент кода вместо первого.
Когда вы говорите «верхний», вы имеете в виду «супер», или это какое-то диджейское программное обеспечение для празднования юбилея, которое вы пишете? 8 = \/ – davidfrancis
Просто используйте AbstractUpperClass.this.someMethod() – Yura
Ваш код непонятен. Можете ли вы предоставить действительный [SSCCE] (http://sscce.org/)? –