Java 8中的比较器接口如何变成@FunctionalInterface

时间:2019-03-20 06:40:25

标签: java java-8

我想澄清一下我对@FunctionalInterface的理解。 据我所知,我们可以在仅具有一个抽象方法的接口上添加@FunctionalInterface注释(尽管它可以具有多个默认和静态方法。

在Java 8中,Comparator<T>接口已用@FunctionalInterface标记,因此可以在Lambda表达式中使用,但是当我打开定义时,在那里可以看到2个抽象类

int compare(T o1, T o2);boolean equals(Object obj);

我想了解在功能接口中如何可能有两个以上的抽象方法而仍然没有出现任何错误?帮助我清除对此的理解。

2 个答案:

答案 0 :(得分:6)

您的问题在@FunctionalInterface批注的Java docs中得到回答:

  

如果接口声明了覆盖其中一个的抽象方法   java.lang.Object的公共方法,该方法也不计入   接口的抽象方法的数量,因为   接口将通过java.lang.Object或   其他地方。

因此Comparator接口中boolean equals(Object obj);的存在不会增加接口中存在的抽象方法的数量,因此我们可以将@FunctionalInterface应用于此接口。

答案 1 :(得分:2)

boolean equals(Object obj)已在java.lang.Object上定义,因此它实际上不是界面中的“新”方法。此处只是“重复”,因为实施合同(它是Javadoc的一部分,但未由编译器强制执行)已变得更加严格(必须与compare保持一致)。