7

Java 8 の機能的インターフェースの定義は、次のように述べています。

関数型インターフェイスは、明示的に宣言された抽象メソッドを 1 つだけ 持つインターフェイスとして定義されます。(インターフェイスには抽象化されていないデフォルト メソッドが含まれる場合があるため、修飾が必要です。) これが、関数型インターフェイスが単一抽象 メソッド (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);
        }
    }

そして、ラムダ式は次のように述べています。

ラムダ式は機能インターフェースに割り当て可能であるべきです

このComparatorインターフェースには、 および で注釈が付けられた 2 つの抽象メソッドがcompareありequalsます@FunctionalInterface。これは、抽象メソッドが 1 つしかない関数型インタフェースの定義に違反していませんか?

4

1 に答える 1