7

Java 8 中函数式接口的定义说:

函数式接口被定义为具有一个明确声明 的抽象方法的任何接口。(限定是必要的,因为接口可能有非抽象的默认方法。)这就是为什么函数式接口过去被称为单一抽象 方法(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 表达式应该可以分配给功能接口

Comparator接口有两个抽象方法,它们分别是compareequals并用 注释@FunctionalInterface。这不违反只有一个抽象方法的功能接口的定义吗?

4

1 回答 1

14

确实,Comparator接口有 2 个抽象方法。但是其中一个是equals,它覆盖了类中equals定义的方法Object,这个方法不算。

来自@FunctionalInterface

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

因此,这使得Comparator接口成为功能方法所在的功能接口compare(o1, o2)

lambda 表达式(a, b) -> a > b ? -1 : 1符合该协定:它声明 2 个参数并返回一个int.

于 2016-04-25T15:14:12.267 回答