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

17
задан Martijn Courteaux 6 July 2011 в 15:34
поделиться

3 ответа

Вы можете использовать то, что называется квалифицированным this .

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

На любой лексически включающий экземпляр можно сослаться, явно указав ключевое слово this .

Пусть C будет классом, обозначенным ClassName . Пусть n будет целым числом, таким, что C является n -м лексически включающим классом класса, в котором появляется уточненное это выражение. Значение выражения формы ClassName.this является n -м лексически включающим экземпляром this (§8.1.3). Тип выражения - C . Это ошибка времени компиляции, если текущий класс не является внутренним классом самого класса C или C .

В этом случае вы можете сделать то, что предлагает Мартин, и использовать:

workWithWidget(SearchWidget.this);

Ссылки

Связанные вопросы

23
ответ дан 30 November 2019 в 11:08
поделиться

Вы можете написать имя внешнего класса, а затем .this . Итак:

workWithWidget(SearchWidget.this);
20
ответ дан 30 November 2019 в 11:08
поделиться

Чтобы получить доступ к 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();

}
}
1
ответ дан 30 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: