[英]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.