功能接口比较器有2种抽象方法

2022-09-01 06:43:01

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

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

答案 1

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

请参阅 FunctionalInterface 的 javadoc

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


答案 2

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

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


推荐