web-dev-qa-db-ja.com

コンパレータに2つの抽象メソッドがある場合、コンパレータはどのように機能的インターフェイスになることができますか?

Java 8では、@FunctionalInterfaceアノテーションは、機能インターフェースとして抽象メソッドを1つだけ持つインターフェースを示すために導入されています。その導入の理由の1つは、ラムダ式を関数型インターフェイスのコンテキストで使用できることをユーザー(プログラマー)に示すことです。

Comparatorインターフェースには@FunctionalInterface。ただし、2つの方法は抽象的です。

int compare(T o1, T o2);

そして

boolean equals(Object obj);

FunctionalInterface のドキュメントでは、次のように明記されています

概念的には、関数型インターフェースには1つの抽象メソッドしかありません。

equalsメソッドは、ここでは抽象的とは見なされていませんか?

22
Arun

ドキュメントはまた述べています:

インターフェイスがJava.lang.Objectのパブリックメソッドのいずれかをオーバーライドする抽象メソッドを宣言する場合、インターフェイスの実装にはJava.lang.Objectまたは他の場所からの実装があるため、インターフェイスの抽象メソッド数にはカウントされません。

また、equalsはこれらのメソッドの1つであるため、インターフェースの「抽象メソッド数」は1のままです。

36
luk2302

また FunctionalInterfaceドキュメントページ から:

インターフェイスが抽象メソッドを宣言する場合Java.lang.Objectのパブリックメソッドの1つをオーバーライドすると、それも行いますしないカウント =インターフェイスのすべての実装にはJava.lang.Objectまたはその他の場所からの実装があるため、インターフェイスの抽象メソッドカウントに向けて。 【重点鉱山】

equalsObjectのパブリックメソッドであるため、このステートメントが適用されます。したがって、Comparatorの場合、compareメソッドのみが抽象メソッド数に影響します。

このルールが適用されるその他の注目すべきメソッドは toString および hashCode です。

15
gyre