当Comparator有两个抽象方法时,它如何成为一个function界面?

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

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

 int compare(T o1, T o2); 

 boolean equals(Object obj); 

FunctionalInterface的文档中,它被明确提到为

从概念上讲,function界面只有一种抽象方法。

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

文档还说明:

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

由于equals是其中一种方法,因此接口的“抽象方法计数”仍为1。

同样来自FunctionalInterface文档页面 :

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

由于equalsObject的公共方法,因此该语句适用; 因此,对于Comparator只有compare方法有助于抽象方法计数。

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