假设您有以下代码:
public abstract class DecisionFunctionJ {
public abstract double evaluate();
public DecisionFunctionJ add(final DecisionFunctionJ another) {
return new DecisionFunctionJ() {
@Override
public double evaluate() {
return this.evaluate() + another.evaluate();
}
};
}
}
此代码无法正常工作,因为它会导致无限循环/ StackOverflowException
。原因很明显:this.evaluate()
引用内部匿名类的evaluate
方法,而不引用外部抽象类的evaluate
方法。
如何执行外部evaluate
方法?使用DecisionFunctionJ.this.evaluate()
无济于事,因为这两个类都是DecitionFunctionJ
类型。
还有其他可能性吗?
答案 0 :(得分:7)
您可以使用DecisionFunctionJ.this
引用来引用封闭类:
public abstract class DecisionFunctionJ {
public abstract double evaluate();
public DecisionFunctionJ add(final DecisionFunctionJ another) {
return new DecisionFunctionJ() {
@Override
public double evaluate() {
return DecisionFunctionJ.this.evaluate() + another.evaluate();
}
};
}
}
答案 1 :(得分:1)
您可以添加第二个私有方法以避免命名冲突:
public abstract class DecisionFunctionJ {
public abstract double evaluate();
public DecisionFunctionJ add(final DecisionFunctionJ another) {
return new DecisionFunctionJ() {
@Override
public double evaluate() {
return outerEvaluate() + another.evaluate();
}
};
}
private double outerEvaluate(){
return evaluate();
}
}