函數式接口表明的是隻能由一個抽象方法,多個類方法或多個默認方法,可是查閱Comparator接口的源碼,發現它有兩個抽象方法(compare和equals方法),但它又使用了@FunctionalInterface註解,感到有點疑惑。java
public @interface FunctionalInterface 官方文檔這樣說: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 from java.lang.Object or elsewhere.
若是接口聲明瞭一個覆蓋java.lang.Object的全局方法之一的抽象方法,那麼它不會計入接口的抽象方法數量中,由於接口的任何實現都將具備java.lang.Object或其餘地方的實現。函數
函數式接口中能夠額外定義多個抽象方法,但這些抽象方法簽名必須和Object的public方法同樣。.net
接口最終有肯定的類實現, 而類的最終父類是Object。 所以函數式接口能夠定義Object的public方法。接口
如如下的接口依然是函數式接口:文檔
@FunctionalInterfaceget
public interface ObjectMethodFunctionalInterface {源碼
void count(int i);hash
String toString(); //same to Object.toStringio
int hashCode(); //same to Object.hashCodeclass
boolean equals(Object obj); //same to Object.equals
}
爲何限定public類型的方法呢?由於接口中定義的方法都是public類型的。 舉個例子,下面的接口就不是函數式接口:
interface WrongObjectMethodFunctionalInterface {
void count(int i);
Object clone(); //Object.clone is protected
}
由於Object.clone方法是protected類型。