35

学习 Java 8 Lambda,只是想知道编译器如何知道 Comparator 中的哪个方法用于 lambda 表达式?好像不是SAM接口?它有2个抽象方法:

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

3 回答 3

54

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

请参阅FunctionalInterface 的 javadoc

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

于 2014-05-18T12:24:07.480 回答
5

equals()是从 Object 继承的,在判断一个接口是否为函数式接口时,继承的公共方法不计算在内。因此,即使equals()在 Comparator 中是抽象的,因为它是继承的,所以它不算数。

规则: 功能接口是具有一个抽象方法的接口。默认方法不算;静态方法不算;并且从 Object 继承的方法不算在内。

于 2018-10-06T17:06:21.573 回答
1

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

因此,Comparator Interface 的 Implanting 类只需要覆盖一个方法。
这使得 Comparator 接口中只有一个抽象方法

这就是为什么 Comparator 是一个函数式接口

于 2018-07-11T15:42:41.063 回答