根据函数接口的定义-函数接口是只包含一个抽象方法的接口
但Comparator<T>
有两种抽象方法:
int compare(T o1, T o2);
boolean equals(Object obj);
其他是默认的和静态的。
JavaDocs将其称为功能接口。怎么可能呢?
您读错了定义,或者至少是一个(过度(简化的定义。
功能接口的正确定义是:
函数接口是一个只有一个抽象方法(除了Object的方法(的接口,因此表示单个函数契约。这个";单个";方法可以采用具有从超接口继承的重写等效签名的多个抽象方法的形式;在这种情况下,继承的方法在逻辑上表示单个方法。
来源:Java语言规范第9.8节
如果您查看Comparator<T>
的源代码,它如下所示:
@FunctionalInterface
public interface Comparator<T> {
// abstract method
int compare(T o1, T o2);
// abstract method, overriding public methods of `java.lang.Object`, so it does not count
boolean equals(Object obj);
}
equals
是一个抽象方法,覆盖了java.lang.Object
的一个公共方法,这不算抽象方法。
所以实际上比较器只有一个抽象的方法int compare(T o1, T o2)
,它满足功能接口的定义。
equals
仅明确包含在Comparator
接口中,因此他们可以向其中添加一些额外的JavaDocs,例如一些特定于比较器的要求:
只有当指定的对象也是一个比较器,并且它强制执行与此比较器相同的排序时,此方法才能返回true
来源:Comparator JavaDocs
JLS表示:
接口不是从Object继承的,而是隐式声明许多与目标(§9.2(相同的方法
所以Comparator
作者所做的就是显式地声明一些通常是隐式的东西。
如果Object
的方法被视为定义函数接口的抽象方法,那么no函数接口将只有一个抽象方法。因此,它们不被考虑:
函数接口是一个只有一个抽象的接口方法(除了Object的方法(
JLS,强调挖掘