FunctionalInterface Comparator有2个抽象方法

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

@FunctionalInterface public interface Comparator { 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或其他地方的实现。

所有类都来自Object类,而Object包含一个相等的方法。因此,这意味着实现Comparator的每个实例都已经具有相等方法的实现,因为该实例也是从每个类的Object下降。 因此,比较器接口只有一种方法总是必须由实现它的类实现,因此是一个function接口。

equals()从Objectinheritance,当您确定接口是否为function接口时,不会计算inheritance的公共方法。 因此,尽管equals()在Comparator中是抽象的,因为它是inheritance的,但它不计算在内。

规则: function接口是一个具有一个抽象方法的接口。 默认方法不计算; 静态方法不计; 和从Objectinheritance的方法不计算在内。