我知道一堆使用body的方法是使用Java的關鍵字default
添加的。我的問題是這個註釋在哪裏有用?我發現只有一個抽象方法可以添加這樣的註釋。但比較有兩個抽象方法:爲什麼@FunctionalInterface註釋被添加到Java 8中的Comparator接口?
int compare(T o1, T o2);
boolean equals(Object obj);
另外,請解釋使用此批註嗎?我看到它是一個運行時註釋,所以它有什麼用途?
我知道一堆使用body的方法是使用Java的關鍵字default
添加的。我的問題是這個註釋在哪裏有用?我發現只有一個抽象方法可以添加這樣的註釋。但比較有兩個抽象方法:爲什麼@FunctionalInterface註釋被添加到Java 8中的Comparator接口?
int compare(T o1, T o2);
boolean equals(Object obj);
另外,請解釋使用此批註嗎?我看到它是一個運行時註釋,所以它有什麼用途?
從documentation of FunctionalInterface
:
如果接口聲明瞭一個抽象方法覆蓋的
java.lang.Object
公衆的方法之一,也不會向接口的抽象方法計算,因爲該接口的任何實施都會有一個從java.lang.Object
或其他地方執行。
由於equals
是從java.lang.Object
,它不計算在內。這是與FunctionInterface
有關的compare
方法。
謝謝。你能解釋一下這個註釋的用法嗎?我看到它是一個運行時註釋,那麼除了在instanceof運算符中使用它以外,還有什麼用? – user2296988
@ user2296988它主要用於文檔和靜態分析工具,例如建議IDE應該建議將匿名類更改爲lambda表達式。 –
更確切地說,它的目的是_捕獲設計意圖_。這裏的具體設計意圖是這個接口描述了一個獨立的行爲(計算一個函數,分配一個資源等),因此對於lambda表達式和方法引用來說是明智的。 –
這很有用,因爲如果你添加它並且你在接口中有多個方法,你將會得到一個編譯錯誤。 @FunctionalInterface
s用於讓Java知道這段代碼可能會被替換爲lambda表達式,因爲每個lambda都是一些@FunctionalInterface
的實現。它有助於編譯器知道什麼是方法簽名。
這有你的答案我想:http://stackoverflow.com/questions/28166187/why-it-isnt-functionalinterface-used-on-all-the-interfaces-in-the-jdk-that-qua – Tunaki
是什麼讓你認爲「平等」是抽象的? – Pshemo
我的意思是兩種方法。編輯....謝謝 – user2296988