Java 8中功能接口的定义说:
功能界面定义为完全的任何界面 一个显式声明的抽象方法。 (资格是 必要的,因为接口可能有非抽象的默认方法。) 这就是为什么功能接口曾被称为Single Abstract 方法(SAM)接口,这个术语有时仍然可见。
那我们怎么会这样:
List<Double> temperature =
new ArrayList<Double>(Arrays.asList(new Double[] { 20.0, 22.0, 22.5 }));
temperature.sort((a, b) -> a > b ? -1 : 1);
由于sort
中的List
方法是:
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
lambda表达式说:
Lambda Expression应该可以分配给功能接口
Comparator
接口有两个抽象方法,compare
和equals
,并使用@FunctionalInterface
进行注释。这是否违反了只有一种抽象方法的功能界面的定义?
答案 0 :(得分:14)
Comparator
接口确实有2个抽象方法。但其中一个是equals
,它会覆盖equals
类中定义的Object
方法,而且此方法不算数。
如果一个接口声明一个覆盖
java.lang.Object
的公共方法之一的抽象方法,那么不也会计入接口的抽象方法计数,因为它的任何实现都是接口将具有java.lang.Object
或其他地方的实现。
因此,这使得Comparator
接口成为功能方法为compare(o1, o2)
的功能接口。
lambda表达式(a, b) -> a > b ? -1 : 1
符合该合同:它声明了2个参数并返回int
。