Доступ к содержащемуся классу внутреннего класса в Java
Это то, что я сейчас делаю. Есть ли лучший способ доступа к суперклассу?
public class SearchWidget {
private void addWishlistButton() {
final SearchWidget thisWidget = this;
button.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
// A better way to access the super class?
// something like "this.super" ...?
workWithWidget(thisWidget);
}
}
}
}
Я программирую с помощью Google Web Toolkit, но я думаю, что это действительно общий вопрос Java.
Ответы
Ответ 1
Вы можете использовать то, что называется квалифицированным this
.
Любой лексически охватывающий экземпляр может ссылаться, явно определяя ключевое слово this
.
Пусть C - класс, обозначаемый ClassName
. Пусть n - целое число, такое, что C является n-м лексически охватывающим классом класса, в котором появляется соответствующее выражение. Значение выражения формы ClassName.this
является n-м лексически охватывающим экземпляром this
(§8.1.3). Тип выражения - C. Это ошибка времени компиляции, если текущий класс не является внутренним классом класса C или C.
В этом случае вы можете сделать то, что предлагает Martijn, и использовать:
workWithWidget(SearchWidget.this);
Ссылки
Связанные вопросы
Ответ 2
Вы можете написать имя внешнего класса, а затем .this
. Итак:
workWithWidget(SearchWidget.this);
Ответ 3
Чтобы получить доступ к super
объекта, который содержит объект анонимного класса от этого объекта, попробуйте в вашем случае SearchWidget.super
Пример: (см. третий вызов Child.super.print()
)
public class Test1 {
public static void main(String[] args) {
new Child().doOperation();
}
}
class Parent {
protected void print() {
System.out.println("parent");
}
}
class Child extends Parent {
@Override
protected void print() {
super.print();
System.out.println("child");
}
void doOperation() {
new Runnable() {
public void run() {
print(); // prints parent child
Child.this.print(); // prints parent child
Child.super.print(); // prints parent
}
}.run();
}
}