2015-07-13 24 views
1

我有以下的靜態方法:創建於return語句一個匿名類

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導致編譯錯誤的行:

Cannot refer to the non-final local variable leaf defined in an enclosing scope

爲什麼在Java中8允許指非最終變量?

回答

3

Java 8允許從匿名類和lambda表達式訪問有效的最終變量(即局部變量不是最終的,但可以標記爲final,因爲它們的值不會更改)。

您可以通過leaf最終克服了以前的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 
     } 
    }; 
} 
4

是啊,這其實你有什麼期望,因爲從Java 8日起:

a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.

Documentation

有效最終:變量或參數值爲n初始化後更改過。