开发者

Accessing the containing class of an inner class in Java

开发者 https://www.devze.com 2022-12-30 12:44 出处:网络
This is what I\'m doing now. Is there a better way to acces开发者_开发知识库s the super class?

This is what I'm doing now. Is there a better way to acces开发者_开发知识库s the super class?

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);
            }
        }
    }
}

I'm programming with Google Web Toolkit, but I think this is really a generic Java question.


You can use what is called the qualified this.

JLS 15.8.4. Qualified This

Any lexically enclosing instance can be referred to by explicitly qualifying the keyword this.

Let C be the class denoted by ClassName. Let n be an integer such that C is the n-th lexically enclosing class of the class in which the qualified this expression appears. The value of an expression of the form ClassName.this is the n-th lexically enclosing instance of this (§8.1.3). The type of the expression is C. It is a compile-time error if the current class is not an inner class of class C or C itself.

In this case, you can do what Martijn suggests, and use:

workWithWidget(SearchWidget.this);

References

  • JLS 15.8.4. Qualified This
  • JLS 8.1.3 Inner Classes and Enclosing Instances

Related questions

  • Access outer class from inner class: Why is it done this way?


You can write the name of the outer class and then .this. So:

workWithWidget(SearchWidget.this);


To access super of the object that contains an object of an anonymous class from that object, try, in your case SearchWidget.super


Example:(see the third call 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();

}
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号