繁体   English   中英

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

[英]Refer to enclosing class' this from anonymous inner class

假设您有以下代码:

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 / StackOverflowException 这样做的原因是明确的: this.evaluate()引用了evaluate内匿名类的方法,而不是evaluate外抽象类的方法。

如何执行外部evaluate方法? 使用DecisionFunctionJ.this.evaluate()没有帮助,因为这两个类都是DecitionFunctionJ类型。

还有什么其他可能性?

您可以使用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();
            }
        };
    }
}

您可以添加第二个私有方法以避免命名冲突:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM