函数式接口代表的是只能由一个抽象方法,多个类方法或多个默认方法,但是查阅Comparator接口的源码,发现它有两个抽象方法(compare和equals方法),但它又使用了@FunctionalInterface注解,感到有点疑惑。
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方法一样。
接口最终有确定的类实现, 而类的最终父类是Object。 因此函数式接口可以定义Object的public方法。
如以下的接口依然是函数式接口:
@FunctionalInterface
public interface ObjectMethodFunctionalInterface {
void count(int i);
String toString(); //same to Object.toString
int hashCode(); //same to Object.hashCode
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类型。