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。我英语考得不好,很抱歉。