学习 Java 8 Lambda,只是想知道编译器如何知道 Comparator 中的哪个方法用于 lambda 表达式?好像不是SAM接口?它有2个抽象方法:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
学习 Java 8 Lambda,只是想知道编译器如何知道 Comparator 中的哪个方法用于 lambda 表达式?好像不是SAM接口?它有2个抽象方法:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
equals()
不是抽象方法。此方法覆盖Object.equals(Object)
,并且只有 Comparator 接口能够将 javadoc 附加到该方法,解释比较器应如何实现equals()
。
请参阅FunctionalInterface 的 javadoc:
如果一个接口声明了一个覆盖 java.lang.Object 的公共方法之一的抽象方法,这也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有来自 java.lang.Object 或其他地方的实现。
equals()是从 Object 继承的,在判断一个接口是否为函数式接口时,继承的公共方法不计算在内。因此,即使equals()在 Comparator 中是抽象的,因为它是继承的,所以它不算数。
规则: 功能接口是具有一个抽象方法的接口。默认方法不算;静态方法不算;并且从 Object 继承的方法不算在内。
所有类都来自 Object 类,并且 Object 包含一个 equal 方法。
因此,这意味着实现 Comparator 的每个实例都已经实现了 equal 方法。
因此,Comparator Interface 的 Implanting 类只需要覆盖一个方法。
这使得 Comparator 接口中只有一个抽象方法