2017-04-25 12 views
5

Java 8で、@FunctionalInterfaceアノテーションは、関数インタフェースとして厳密に1つの抽象メソッドを持つインタフェースを示すために導入されています。その導入の理由の1つは、ラムダ式が機能的インタフェースのコンテキストで使用できることをユーザ(プログラマ)に示すことです。2つの抽象メソッドがある場合、コンパレータはどのように機能インターフェイスになりますか?

Comparatorインターフェイスには、@FunctionalInterfaceという注釈が付けられています。しかし、2つの方法は抽象的なものです。 FunctionalInterfaceのドキュメントで

int compare(T o1, T o2); 

boolean equals(Object obj); 

、それが明確

概念的には、機能インタフェースは、正確に1つの抽象メソッドを有するように記載されています。

equalsメソッドはここでは抽象的ではありませんか?

+2

「概念的に」はおそらくここのキーワードであり、「実際に」とは区別されます。 – gyre

+2

'equals'は' Object'から継承されます。 –

答えて

14

もドキュメントの状態:

interfaceインターフェイスのいずれかの実装がありますので、また、インタフェースの抽象メソッドの数にカウントされませんjava.lang.Objectの公開方法のいずれかをオーバーライド抽象メソッドを、宣言した場合java.lang.Objectまたは他の場所の実装です。

そしてequalsので、それらのいずれかの方法で、インターフェースの「抽象メソッドの数」であるが、まだthe FunctionalInterface documentation pageからまた1

+1

私の質問に答える。ありがとう! – Arun

8

です:インターフェイスは抽象メソッドを宣言した場合

java.lang.Objectのパブリックメソッドの1つをオーバーライドすると、ではなく、カウントのインターフェイスの抽象的な基準インターフェイスの実装にはjava.lang.Objectまたは他の場所からの実装があるため、hodカウントになります。 [emphasis mine]

equalsは公開方法Objectであるため、この文が適用されます。したがって、Comparatorについては、compareメソッドのみが抽象メソッドカウントに寄与します。

このルールが適用されるその他の注目すべき方法は、toStringおよびhashCodeです。

+1

私の質問に答える。ありがとう! – Arun

+2

喜んで助けてください!あなたはもう質問があれば教えてください:) – gyre

関連する問題