Java FunctionInterface Comparator有两种抽象方法

Java FunctionInterface Comparator有两种抽象方法,java,lambda,java-8,functional-interface,Java,Lambda,Java 8,Functional Interface,学习Java8Lambda,只是想知道编译器如何知道Comparator中的哪个方法用于lambda表达式? 它似乎不是SAM接口?它有两种抽象方法: @FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } @functioninterface 公共接口比较器{ int比较(to1,to2); 布尔等于(对

学习Java8Lambda,只是想知道编译器如何知道Comparator中的哪个方法用于lambda表达式? 它似乎不是SAM接口?它有两种抽象方法:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}
@functioninterface
公共接口比较器{
int比较(to1,to2);
布尔等于(对象obj);
}
equals()
不是抽象方法。此方法重写
Object.equals(Object)
,并且只有Comparator接口才能将javadoc附加到该方法,解释了Comparator应该如何实现
equals()

见:

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


所有类都从Object类派生,Object包含一个相等的方法。
所以,这意味着实现Comparator的每个实例都已经有了equal方法的实现。 因此,比较器接口的植入类只需重写一个方法。
这使得比较器接口中只有一个抽象方法

这是

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

规则:
函数接口是具有一个抽象方法的接口。默认方法不算数;静态方法不算数;从对象继承的方法不算数。

遗憾的是,
equals
被列在抽象方法选项卡下,而实际上它不是一个抽象方法。你是说
equals
方法是重写的,但接口或函数接口不是对象类的子类。你能帮我理解这一点吗?