Java 8では、@FunctionalInterface
アノテーションは、機能インターフェースとして抽象メソッドを1つだけ持つインターフェースを示すために導入されています。その導入の理由の1つは、ラムダ式を関数型インターフェイスのコンテキストで使用できることをユーザー(プログラマー)に示すことです。
Comparator
インターフェースには@FunctionalInterface
。ただし、2つの方法は抽象的です。
int compare(T o1, T o2);
そして
boolean equals(Object obj);
FunctionalInterface
のドキュメントでは、次のように明記されています
概念的には、関数型インターフェースには1つの抽象メソッドしかありません。
equals
メソッドは、ここでは抽象的とは見なされていませんか?
ドキュメントはまた述べています:
インターフェイスが
Java.lang.Object
のパブリックメソッドのいずれかをオーバーライドする抽象メソッドを宣言する場合、インターフェイスの実装にはJava.lang.Object
または他の場所からの実装があるため、インターフェイスの抽象メソッド数にはカウントされません。
また、equals
はこれらのメソッドの1つであるため、インターフェースの「抽象メソッド数」は1のままです。
また FunctionalInterface
ドキュメントページ から:
インターフェイスが抽象メソッドを宣言する場合
Java.lang.Object
のパブリックメソッドの1つをオーバーライドすると、それも行いますしないカウント =インターフェイスのすべての実装にはJava.lang.Object
またはその他の場所からの実装があるため、インターフェイスの抽象メソッドカウントに向けて。 【重点鉱山】
equals
はObject
のパブリックメソッドであるため、このステートメントが適用されます。したがって、Comparator
の場合、compare
メソッドのみが抽象メソッド数に影響します。