请参阅匿名内部类封闭类'this

时间:2014-02-04 16:50:02

标签: java

假设您有以下代码:

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类型。

还有其他可能性吗?

2 个答案:

答案 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();
    }
}