当比较器有两个抽象方法时,它怎么能成为一个功能接口呢?

在 Java 8 中,引入注解来表示任何仅具有一个抽象方法作为功能接口的接口。引入它的原因之一是指示用户(程序员),lambda表达式可以在功能接口的上下文中使用。@FunctionalInterface

该接口用 注释。但是,有两种方法是抽象的。Comparator@FunctionalInterface

int compare(T o1, T o2);

boolean equals(Object obj);

FunctionalInterface的文档中,它被清楚地提到

从概念上讲,函数接口只有一个抽象方法。

这里的方法不被认为是抽象的吗?equals


答案 1

这些文档还指出:

如果一个接口声明一个抽象方法重写 的公共方法之一,那也不计入接口的抽象方法计数,因为接口的任何实现都将具有来自或其他地方的实现。java.lang.Objectjava.lang.Object

由于是这些方法之一,因此接口的“抽象方法计数”仍然是1。equals


答案 2

同样来自功能接口文档页面

如果一个接口声明一个抽象方法覆盖了java.lang.Object的公共方法之一,那么这也不会计入接口的抽象方法计数,因为接口的任何实现都将具有来自或其他地方的实现。[强调我的]java.lang.Object

由于 equals 是 的公共方法,因此此语句适用;因此,因为只有方法才有助于抽象方法计数。ObjectComparatorcompare

此规则适用的其他值得注意的方法是 toStringhashCode


推荐