当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
或其他地方的实现。 [强调我的]
由于equals
是Object
的公共方法,因此该语句适用; 因此,对于Comparator
只有compare
方法有助于抽象方法计数。
此规则适用的其他值得注意的方法是toString
和hashCode
。