FunctionalInterface Comparator有2个抽象方法

时间:2014-05-18 12:14:26

标签: java lambda java-8

学习Java 8 Lambdas,只是想知道编译器如何知道Comparator中哪个方法用于lambda表达式? 它似乎不是一个SAM界面?它有两种抽象方法:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

4 个答案:

答案 0 :(得分:43)

equals()不是抽象方法。此方法会覆盖Object.equals(Object),并且只有Comparator接口能够将javadoc附加到方法,解释比较器应如何实现equals()

请参阅javadoc of FunctionalInterface

  

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

答案 1 :(得分:3)

equals()继承自Object,并且在确定接口是否为功能性接口时,不计算继承的公共方法。因此,即使 equals()在Comparator中是抽象的,但由于它是继承的,因此不算在内。

规则: 功能接口是具有一种抽象方法的接口。默认方法不计算在内; 静态方法不计算在内;和从对象继承的方法不计算在内。

答案 2 :(得分:1)

所有类都源自Object类,并且Object包含一个相等的方法。
因此,这意味着实现Comparator的每个实例将已经具有equal方法的实现。

因此,Comparator接口的Implanting类仅需要重写一种方法。
这使得Comparator界面中只有一种抽象方法

这是why Comparator is a functional interface

答案 3 :(得分:0)

equals()不被视为抽象方法,因为它存在于对象类中。
在Java中,每个类都通过defalut扩展Object。


任何实现Comparator的类都将具有defalut的equals()方法主体。因此不必强制覆盖它

这就是为什么Comparator类被认为只有一个抽象方法的原因。

您可以在Why Comparator is SAM interface even with 2 absract method?

阅读更多内容