2014-11-25 85 views

回答

6

@FunctionalInterface註釋有兩個目的。關於編譯器和它必須產生的錯誤,確實就足夠了,因爲在這方面,它隻影響用@FunctionalInterface註解的類。

然而,它具有第二個目的,記錄使用這個interface作爲功能接口的事實的確是有意的,並且可以以這種方式使用它,而不僅僅是像例如一樣的巧合。 Comparable,不打算這樣使用。

因此它被註解爲@Documented並且具有最大值RetentionPolicy來完成第二個目的。

+0

是否每個@Documented接口具有最大的RetentionPolicy(RUNTIME)? – auntyellow 2014-11-25 10:45:55

+0

也許得到了答案(http://stackoverflow.com/questions/20775614) – auntyellow 2014-11-25 10:58:12

+2

@auntyellow:這不是一個硬性要求,但是,它的目的是使信息廣泛可用導致的結論,你通常*希望*最大保留。順便說一句'RetentionPolicy.CLASS'沒有提供比'RUNTIME'更好的優勢。它在類文件中消耗相同數量的空間,並且由於Reflection僅在需求上加載註釋,所以在運行時內不可用也沒有好處。 – Holger 2014-11-25 11:18:03

2

「Source」是不夠的,因爲如果您創建了一個API並將您的類作爲預編譯的jar提供,那麼該編譯器將不再提供這些信息。

如果您想要支持那些在運行時針對類進行「編譯」的編譯器,比如使用反射查找這些註釋的腳本引擎,並且應該顯示警告,那麼我認爲「類」也不夠用也是。

1

@FunctionalInterface可能用於運行時反射,編譯檢查和java運行時進程。

javap用於反編譯和比較兩個接口,其中一個與@FunctionalInterface,另一個沒有。

只是額外的兩行字節@FunctionalInterface標記接口代碼:

Constant pool: 
    #7 = ... RuntimeVisibleAnnotations 
    #8 = ... Ljava/lang/FunctionalInterface; 

而且兩者執行/λ快遞是在字節代碼級別相同。

除了界面反射:

X.class.getAnnotation(FunctionalInterface.class) == null?; 
相關問題