问题描述
根据功能接口的定义-功能接口是仅包含一种抽象方法的接口。
但是Comparator<T>
有两种抽象方法:
int compare(T o1,T o2);
boolean equals(Object obj);
其他是默认值和静态值。
JavaDocs将其称为功能接口。怎么会呢?
解决方法
您读错了定义,或者至少是一个(过度)简化的定义。
FunctionalInterface的正确定义是:
功能接口是仅具有一个抽象方法(除Object的方法之外)的接口,因此表示单个功能协定。这种“单一”方法可以采取多种抽象方法的形式,这些抽象方法具有从超级接口继承的等效等效签名。在这种情况下,继承的方法在逻辑上表示单个方法。
来源:Java Language Specification section 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
界面中,以便他们可以向其中添加一些其他JavaDoc,例如比较器的一些特定要求:
仅当指定对象也是一个比较器并且施加与该比较器相同的顺序时,此方法才能返回true。
The JLS说:
接口不继承自Object,而是隐式声明 与对象(§9.2)相同的许多方法
所有Comparator
作者所做的都是明确声明通常是隐式的内容。
如果出于定义功能接口的目的将Object
的方法视为抽象方法,则否功能接口将只有一个抽象方法。因此,不考虑它们:
功能接口是只有一个抽象的接口 方法(除了对象的方法之外)
JLS,重点是我的