繁体   English   中英

在return语句中创建一个匿名类

[英]Creating an anonymous class in the return statement

我有以下静态方法:

public static <E> Tree<E> leaf(E leaf) {
    return new Tree<E>() {
        @Override
        public <R> R accept(TreeVisitor<E, R> visitor) {
            return visitor.visit(leaf); //1 Ok in Java 8, fail in Java < 8
        }
    };
}

当我用Java 8开发它时; 它编译良好,现在当我不得不回到Java 7时, //1行会导致编译错误:

无法引用封闭范围中定义的非最终局部变量叶

为什么在Java 8中允许引用非最终变量?

Java 8允许从匿名类和lambda表达式访问有效的最终变量(即不是最终变量但可以被标记为最终变量的局部变量,因为它们的值不会更改)。

您可以通过将leaf final来克服旧Java版本中的编译问题:

public static <E> Tree<E> leaf(final E leaf) {
    return new Tree<E>() {
        @Override
        public <R> R accept(TreeVisitor<E, R> visitor) {
            return visitor.visit(leaf); //1 Ok in Java 8, fail in Java < 8
        }
    };
}

是的,这实际上是您所期望的,因为从Java 8开始:

本地类可以访问最终变量或有效最终变量的封闭块的局部变量和参数。 变量或参数的值在初始化后从未更改,实际上是最终的。

文献资料

有效地最终:一个变量或参数,其值在初始化后便永远不会改变。

暂无
暂无

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

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