2012-08-01 3 views
13

いずれかのコンパレータのインターフェースが定義されて、Javadocの中だけでなく、コード自体:java.util.Comparatorで実装するためにequalsが必須ではないのはなぜですか?

int compare(T o1, T o2); 
boolean equals(Object obj); 

しかし、これはcompilating何ちゃったごめんなさいを与えない:

Comparator a = new Comparator() {  
    @Override public int compare(Object o1, Object o2) { 
     //.. 
    } 
}; 

しかし、この処理が行われます。

どう
Comparator a = new Comparator() {  
    @Override public boolean equals(Object comparator) { 
     //.. 
    } 
}; 

私たちがメソッドをオーバーライドできないようにするためのインターフェイスのために行われた?あなたは、このメソッドを実装しなければならない明確全てJavaDocs explain

答えて

22

まず:指定されたオブジェクトもコンパレータであり、それがこのコンパレータと同じ順序付けを行う場合にのみ

また、このメソッドがtrueを返すことができます。したがって、comp1.equals(comp2)は、すべてのオブジェクト参照o1およびo2に対してsgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))を意味します。

しかし、その後:Object.equals(Object)を上書きしないように、常に安全であることを

注意。

equals()は、インターフェイスの一部であるにもかかわらず、どのようにオーバーライドできないのですか?このメソッドはJava(in Object class)の各オブジェクトごとにすでに実装されているためです。

インターフェイスの宣言は、余分なJavaDocの説明を追加することによって、Comparatorに関してequals()の重要性を強調するためだけにあります。

あなたのコンパレータがステートレスである場合、そのインスタンスは1つだけ必要です。デフォルトのequal()の実装は問題ありません。

+0

私は2番目の部分を読んでいましたが、通常の新しいインスタンスのようにオブジェクトを拡張しているインターアートですか?それとも、どのようなメソッドがすでにどのオブジェクトに実装されている可能性があるので、インターフェイスがそれを強制しないことをインターフェイスが認識しているということですか? – Whimusical

+4

@ user1352530実際には、インタフェースは 'Object'を意識していません。しかし、あなたがインターフェースを実装しているとき、あなたは常に 'Object'から直接的または間接的に継承します。つまり、 'equals()'やその他のものを既に継承しているので、コンパイラは不平を言っていません。一方、あるインタフェースのインスタンスがあるときは、その特定のインタフェースのメソッドではなく、 'Object'メソッドを呼び出すことができます。 –

+0

ニースの答え、便利です! – Whimusical

0

すべてのオブジェクトが既にequals()を実装しています。

実際には、Comparatorインターフェイス定義でequals()を再度指定すると、コントラクトとcompareTo()との関係を文書化する機会を与える以外は何も正確に実行されません。

関連する問題