まず、すべての関数型インターフェースでアノテーションを使用できます:@FunctionalInterface。次に、アノテーションのjavadocを見てみましょう。
インターフェース型宣言がJava言語仕様で定義された機能インターフェースであることを意図することを示すために使用される有益な注釈タイプ。概念的には、機能インターフェースには厳密に1つの抽象メソッドがあります。デフォルトのメソッドには実装があるため、抽象メソッドではありません。インターフェイスがjava.lang.Objectのパブリックメソッドの1つをオーバーライドする抽象メソッドを宣言する場合、インターフェイスの実装にはjava.lang.Objectまたは他の場所からの実装があるため、インターフェイスの抽象メソッドの数にはカウントされません。
関数型インターフェースのインスタンスは、ラムダ式、メソッド参照、またはコンストラクター参照で作成できることに注意してください。
型にこの注釈型で注釈が付けられている場合、以下の場合を除いて、コンパイラはエラーメッセージを生成する必要があります。
•タイプがインターフェイス型であり、注釈型、列挙型、またはクラスではない。
•注釈付きの型は、機能的なインターフェイスの要件を満たします。
ただし、コンパイラーは、機能インターフェースの定義に適合するインターフェースを、機能インターフェースのアノテーションがインターフェース宣言にあるかどうかに関係なく、機能インターフェースとして扱います。
次に、手動で翻訳してみましょう
。Java言語仕様の定義によれば、この注釈を使用したインターフェース型宣言は、機能インターフェースと見なされます。概念的には、関数型インターフェースには1つだけの抽象メソッドがあります。デフォルトのメソッドが実装されているため、これらは抽象メソッドではありません。インターフェイスで宣言された抽象メソッドがスーパークラスオブジェクトのパブリックメソッドをオーバーライドする場合、これらの抽象メソッドはインターフェイスの抽象メソッドの数にカウントされません。インターフェースの実装は、親オブジェクトまたは他の場所からこれらのメソッドの実装を取得するためです。
注:関数インターフェイスの実現は、ラムダ式、メソッド参照、コンストラクタ参照などによって実現できます。
型がこの注釈を使用する場合、型が注釈型、列挙型、またはクラスではなくインターフェース型でない限り、コンパイラはエラーメッセージを生成します。同時に、このアノテーションを使用するインターフェースは、機能インターフェースの要件を満たしています。つまり、機能インターフェースには1つの抽象メソッドしかありません。
ただし、コンパイラーは、機能インターフェース(つまり、@ FunctionalInterface)のアノテーションがインターフェース宣言で使用されているかどうかに関係なく、(機能インターフェースの要件を満たす)機能インターフェースとして定義されたすべてのインターフェースを機能インターフェースとして扱います。
それから私たちは知ることができます:
- 関数型インターフェースには、抽象メソッドが1つだけあります。
- デフォルトのメソッドはすでに実装されているため、抽象メソッドではありません。
- スーパークラスのObjectクラスのパブリックメソッドをオーバーライドするメソッドは、インターフェイスの抽象メソッドとは見なされません。
したがって、Comparatorインターフェースには、compareとequalsの2つの抽象メソッドがありますが、equalsはインターフェースの抽象メソッドとしてカウントされないため、Comparatorインターフェースは機能インターフェースの要件を満たし、Comparatorインターフェースは機能インターフェースです。