「A functional interface has exactly one abstract method」,也就是「Functional Interface是只有一個抽象方法的Interface」。
例如Java的Comparator
,Runnable
都是Functional Interface。
而Java 8多了@FunctionalInterface
用來標明屬於Functional Interface的介面。
設計Functional Interface目的是為了搭配Lambda語法使用。
自訂一個Functional Interface如下
@FunctionalInterface
public interface DemoFunctionalInterface {
void onlyOneAbstractMethod();
}
不過你若是看過原始碼可能覺得奇怪,Comparator
中明明除了compare()
外,還有另一個抽象方法equals()
,兩個抽象方法不就違反上述Functional Interface只有能一個抽象方法的規則嗎?那是因為若宣告的抽象方法是覆寫java.lang.Object
的公開方法,例如Object.equals()
,則這類的抽象方法並不算在這個介面上,因為Object
本身已經實作了此方法了。因此Comparator
中只有一個compare()
抽象方法,也符合Funcitional Interface的定義。
節錄Functional Interface的API說明如下
...If an interface declares an abstract method overriding one of the public methods of
java.lang.Object
, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation fromjava.lang.Object
or elsewhere.
沒有留言:
張貼留言