Java 参见封闭类';这是来自匿名内部类的
假设您得到以下代码:Java 参见封闭类';这是来自匿名内部类的,java,Java,假设您得到以下代码: public abstract class DecisionFunctionJ { public abstract double evaluate(); public DecisionFunctionJ add(final DecisionFunctionJ another) { return new DecisionFunctionJ() { @Override public double
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();
}
};
}
}
此代码无法按预期工作,因为它会导致EndlessLop/StackOverflowException
。原因很清楚:this.evaluate()
引用内部匿名类的evaluate
方法,而不是外部抽象类的evaluate
方法
如何执行外部评估方法?使用DecisionFunctionJ.this.evaluate()
没有帮助,因为这两个类都属于DecisionFunctionJ
类型
还有哪些可能性?您可以使用决策函数j。此引用引用封闭类:
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();
}
};
}
}
您可以添加第二个私有方法以避免命名冲突:
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();
}
}
您是否尝试过使用DecisionFunctionJ。这个?我不知道它怎么会不起作用。这两个类都属于DecisionFunctionJ
类型,这并不是真的;内部有一个未命名的类型。是的,它是DecisionFunctionJ
的一个子类,而DecisionFunctionJ
的这个实例将是true
。但出于这个目的,即将其用作的前缀。此
,这一事实并不重要。我同意Rohit的观点——我也不知道它怎么会不起作用。@Mad物理学家,谢谢,我知道它是怎么起作用的,如果你们允许的话,我想在之前测试一下-/好的,整个问题有点愚蠢,我转换了一个scala示例,看起来scala依赖于不同于Java。我英语考得不好,很抱歉。