2017-04-25 27 views
5

在Java 8中,引入@FunctionalInterface註釋是爲了表示具有一個抽象方法作爲功能接口的任何接口。其引入的一個原因是向用戶(程序員)表明,lambda表達式可以在功能接口的上下文中使用。當比較器有兩個抽象方法時,它如何成爲一個功能接口?

Comparator接口注有@FunctionalInterface。但是,兩種方法是抽象的。

int compare(T o1, T o2); 

boolean equals(Object obj); 

FunctionalInterface的文檔中,清楚地提及作爲

在概念上,功能接口都只有一個抽象方法。

是不是equals方法在這裏不被認爲是抽象的?

+2

「概念上」可能是這裏的關鍵詞,與「實際上」截然不同。 – gyre

+2

'equals'從Object繼承。 –

回答

14

該文檔也狀態:

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

而且,由於equals是這些方法之一中,接口的「抽象方法計數」仍爲1

+1

回答我的問題。謝謝! – Arun

8
the FunctionalInterface documentation page

另外:

如果接口聲明瞭一個抽象方法重寫java.lang.Object之一的公共方法,即確實不是計數朝向界面的抽象會面因爲接口的任何實現都將具有從java.lang.Object或其他地方的實現。 [重點礦]

由於equalsObject公開的方法,本聲明適用;因此,對於Comparator只有compare方法有助於抽象方法計數。

本規則適用的其他值得注意的方法是toStringhashCode

+1

回答我的問題。謝謝! – Arun

+2

很高興幫助!請讓我知道如果你有任何問題:) – gyre