Доступ к содержащемуся классу внутреннего класса в 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.

JLS 15.8.4. Квалифицировано Это

Любой лексически охватывающий экземпляр может ссылаться, явно определяя ключевое слово 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();

}
}