我用一个实例化另一个匿名类的方法实例化一个匿名类,并且从这个内部匿名类我想调用一个属于外部匿名类的方法。 为了说明它,假设我有如下接口:
interface ReturnsANumber {
int getIt();
}
然后,在我的代码中的某个地方,我这样做:
ReturnsANumber v = new ReturnsANumber() {
int theNumber() {
return 119;
}
public int getIt() {
// In a modern version of Java, maybe I could do
// var a = this;
// and then call a.theNumber();
ReturnsANumber w = new ReturnsANumber() {
int theNumber() {
return 1;
}
public int getIt() {
return this.theNumber();
}
};
return w.getIt();
}
};
System.out.println("The number is " + v.getIt());
问题:在最里面的方法getIt中,我想调用属于最外层匿名类的Number()。 如何在不使用Java 10 var功能的情况下完成(如代码中所示)。
说明:理想情况下,外部匿名类不应该知道内部类想要调用它的theNumber方法。 我们的想法是提出一些代码,让内部类明确地调用外部类的任何方法。
换句话说,如何显示此代码:数字为119(而不是显示数字为1)
目的:有人可能会问我为什么要这样做:我正在编写某种代码生成器,并希望确保我生成的代码不含糊。
从Java 8开始,解决方案非常简单。 只需将方法引用存储在变量中。
ReturnsANumber v = new ReturnsANumber() {
int theNumber() {
return 119;
}
public int getIt() {
Supplier<Integer> supplier = this::theNumber;
ReturnsANumber w = new ReturnsANumber() {
int theNumber() {
return 1;
}
public int getIt() {
return supplier.get();
}
};
return w.getIt();
}
};
存储外部对象也可以解决问题。 但仅限于继承方法:
interface ReturnsANumber {
int theNumber();
int getIt();
}
public int getIt() {
ReturnsANumber outer = this;
ReturnsANumber w = new ReturnsANumber() {
public int theNumber() {
return 1;
}
public int getIt() {
return outer.theNumber();
}
};
return w.getIt();
}
您也可以将方法引用或外部对象存储为字段。
更新
您可以将外部对象传递给lambda:
ReturnsANumber v = new ReturnsANumber() {
...
@Override
public int getIt() {
ReturnsANumber w = Optional.of(this).map(outer ->
new ReturnsANumber() {
int theNumber() {
return 1;
}
public int getIt() {
return outer.theNumber();
}
}).get();
return w.getIt();
}
};