当Comparator有两个抽象方法时,它如何成为一个功能接口?

时间:2017-04-25 16:50:46

标签: java java-8 comparator functional-interface

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

Comparator界面注释为@FunctionalInterface。但是,有两种方法是抽象的。

int compare(T o1, T o2);

boolean equals(Object obj);

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

  

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

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

2 个答案:

答案 0 :(得分:25)

文档还说明:

  

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

由于java.lang.Object是其中一种方法,因此"抽象方法计数"接口仍然是1。

答案 1 :(得分:11)

同样来自the FunctionalInterface documentation page

  

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

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

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