2016-01-17 36 views
4

我知道一堆使用body的方法是使用Java的關鍵字default添加的。我的問題是這個註釋在哪裏有用?我發現只有一個抽象方法可以添加這樣的註釋。但比較有兩個抽象方法:爲什麼@FunctionalInterface註釋被添加到Java 8中的Comparator接口?

  • int compare(T o1, T o2);
  • boolean equals(Object obj);

另外,請解釋使用此批註嗎?我看到它是一個運行時註釋,所以它有什麼用途?

+2

這有你的答案我想:http://stackoverflow.com/questions/28166187/why-it-isnt-functionalinterface-used-on-all-the-interfaces-in-the-jdk-that-qua – Tunaki

+0

是什麼讓你認爲「平等」是抽象的? – Pshemo

+0

我的意思是兩種方法。編輯....謝謝 – user2296988

回答

6

documentation of FunctionalInterface

如果接口聲明瞭一個抽象方法覆蓋的java.lang.Object公衆的方法之一,也不會向接口的抽象方法計算,因爲該接口的任何實施都會有一個從java.lang.Object或其他地方執行。

由於equals是從java.lang.Object,它不計算在內。這是與FunctionInterface有關的compare方法。

+0

謝謝。你能解釋一下這個註釋的用法嗎?我看到它是一個運行時註釋,那麼除了在instanceof運算符中使用它以外,還有什麼用? – user2296988

+1

@ user2296988它主要用於文檔和靜態分析工具,例如建議IDE應該建議將匿名類更改爲lambda表達式。 –

+2

更確切地說,它的目的是_捕獲設計意圖_。這裏的具體設計意圖是這個接口描述了一個獨立的行爲(計算一個函數,分配一個資源等),因此對於lambda表達式和方法引用來說是明智的。 –

2

這很有用,因爲如果你添加它並且你在接口中有多個方法,你將會得到一個編譯錯誤。 @FunctionalInterface s用於讓Java知道這段代碼可能會被替換爲lambda表達式,因爲每個lambda都是一些@FunctionalInterface的實現。它有助於編譯器知道什麼是方法簽名。