SSCCE:
public class Test {
public Test() {
new Anonymous1() {
void validate() {
new Anonymous2() {
int calculate() {
return Math.abs(Anonymous1.this.getValue()); // compilation error - Anonymous1 is not an enclosing class
}
};
}
};
}
}
abstract class Anonymous1 {
abstract void validate();
int getValue() {
return 0;
}
}
abstract class Anonymous2 {
abstract int calculate();
}
我知道它看起来很复杂且无法使用,但我只是想知道是否可以使用Anonymous1
指针或其他任何方式从Anonymous2
指向.this
类。< / p>
答案 0 :(得分:4)
你需要在课堂上这样做。
public Test() {
new Anonymous1() {
void validate() {
final Object this1 = this;
new Anonymous2() {
int calculate() {
return Math.abs(this1.getValue());
}
}
}
}
}
甚至更好,首先提取您需要的东西并在Java 8中有效地使用最终添加。
public Test() {
new Anonymous1() {
void validate() {
int value = getValue();
new Anonymous2() {
int calculate() {
return Math.abs(value);
}
}
}
}
}
如果Anonymous1
和Anonymous2
是接口,则可以在Java 8中使用lambdas。
public Test() {
Anonymous1 a = () -> {
int v = getValue();
Anonymous2 = a2 = () -> Math.abs(v);
};
}