Said in Javadoc:爲什麼@FunctionalInterface具有RUNTIME保留?
如果一個類型與此註釋類型註釋,編譯器產生,除非一條錯誤消息需要 ...
爲什麼不SOURCE
或CLASS
就夠了,像@Override
。
Said in Javadoc:爲什麼@FunctionalInterface具有RUNTIME保留?
如果一個類型與此註釋類型註釋,編譯器產生,除非一條錯誤消息需要 ...
爲什麼不SOURCE
或CLASS
就夠了,像@Override
。
@FunctionalInterface
註釋有兩個目的。關於編譯器和它必須產生的錯誤,確實就足夠了,因爲在這方面,它隻影響用@FunctionalInterface
註解的類。
然而,它具有第二個目的,記錄使用這個interface
作爲功能接口的事實的確是有意的,並且可以以這種方式使用它,而不僅僅是像例如一樣的巧合。 Comparable
,不打算這樣使用。
因此它被註解爲@Documented
並且具有最大值RetentionPolicy
來完成第二個目的。
「Source」是不夠的,因爲如果您創建了一個API並將您的類作爲預編譯的jar提供,那麼該編譯器將不再提供這些信息。
如果您想要支持那些在運行時針對類進行「編譯」的編譯器,比如使用反射查找這些註釋的腳本引擎,並且應該顯示警告,那麼我認爲「類」也不夠用也是。
@FunctionalInterface
可能用於運行時反射,編譯檢查和java運行時進程。
javap用於反編譯和比較兩個接口,其中一個與@FunctionalInterface
,另一個沒有。
只是額外的兩行字節@FunctionalInterface
標記接口代碼:
Constant pool:
#7 = ... RuntimeVisibleAnnotations
#8 = ... Ljava/lang/FunctionalInterface;
而且兩者執行/λ快遞是在字節代碼級別相同。
除了界面反射:
X.class.getAnnotation(FunctionalInterface.class) == null?;
是否每個@Documented接口具有最大的RetentionPolicy(RUNTIME)? – auntyellow 2014-11-25 10:45:55
也許得到了答案(http://stackoverflow.com/questions/20775614) – auntyellow 2014-11-25 10:58:12
@auntyellow:這不是一個硬性要求,但是,它的目的是使信息廣泛可用導致的結論,你通常*希望*最大保留。順便說一句'RetentionPolicy.CLASS'沒有提供比'RUNTIME'更好的優勢。它在類文件中消耗相同數量的空間,並且由於Reflection僅在需求上加載註釋,所以在運行時內不可用也沒有好處。 – Holger 2014-11-25 11:18:03