機能インターフェースの定義は、「機能インターフェースは、( Object のメソッドを除いて) 1 つの抽象メソッドのみを持つインターフェースであり、したがって単一の機能コントラクトを表す」です。
この定義によれば、Comparable<T>
は間違いなく機能的なインターフェースです。
ラムダ式の定義は、「ラムダ式はメソッドのようなものです。正式なパラメータのリストと、それらのパラメータで表現されたボディ (式またはブロック) を提供します。」
ラムダ式の評価により、関数型インターフェイスのインスタンスが生成されます。
したがって、ラムダ式の目的は、機能インターフェースの単一の関数を実装することによって、機能インターフェースのインスタンスを作成できるようにすることです。すなわち。単一の関数でインスタンスを作成できるようにします。
を見てみましょうComparable<T>
。このインターフェイスは、単一の機能として使用するように設計されていますか? すなわち。この単一の関数のみを使用してインスタンスを作成するように設計されていますか?
のドキュメントはComparable<T>
、「このインターフェイスは、それを実装する各クラスのオブジェクトに完全な順序付けを課します。この順序付けは、クラスの自然順序付けと呼ばれ、クラスの compareTo メソッドは、その自然比較メソッドと呼ばれます。」で始まります。
上記の文はComparable<T>
、 が単一の関数として使用されるように設計されていないことを明確に示していますが、この単一の関数を追加することにより、インスタンスの自然な順序付けを持つクラスによって実装されることを常に意図しています。
ラムダ式を使用して作成するように設計されていないことを意味するのはどれですか?
ポイントは、Comparable のみのオブジェクトはなく、実装されることを意図しているため、クラスの追加関数として使用されるということです。
では、ラムダ式の作成をComparable<T>
防止する Java 言語の方法はありますか? インターフェイスの設計者は、このインターフェイスがクラスによって実装されることを意図しており、ラムダ式を使用してこの単一のメソッドでインスタンスとして作成されることを意図していないと判断できますか?
インターフェイスがたまたま単一の抽象メソッドを持っているという理由だけで、それを関数型インターフェイスと見なすべきではありません。
おそらく、Java が NotFunctional のような注釈を提供する場合、このインターフェースがラムダ式の作成に使用されていないことをコンパイラーがチェックできます。
@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }