在了解这个问题之前,首先要知道什么是函数式接口
函数式接口(Functional Interface)就是接口里面只可以有一个抽象的方法,但是可以有多个非抽象方法。
在注解@FuctionalInterface(自动检测是否为函数式接口)的javadoc中如下说明
Conceptually, a functional interface has exactly one abstract method. Since {@linkplain java.lang.reflect.Method#isDefault()
default methods} have an implementation, they are not abstract. If an interface declares an abstract method overriding one of the public methods of {@code java.lang.Object}, that also does <em>not</em> count toward the interface's abstract method count since any implementation of the interface will have an
implementation from {@code java.lang.Object} or elsewhere.
意思就是:
1.函数式接口只会有一个抽象方法
2.default方法不属于抽象方法
3.接口重写了Object的公共方法也不算入内
所以虽然在Comparator看起来有两个抽象的方法。
int compare(T o1, T o2);
boolean equals(Object obj);
但是因为equals是Object的方法,所以不算抽象方法,所以Comparator是函数式接口。
有误望指正