This is what I'm doing now. Is there a better way to access 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();
}
}