14

Javadoc およびコード自体のいずれかで、 Comparator インターフェースは以下を定義します。

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

しかし、これはコンパイルする確率を与えません:

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

しかし、これは:

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

メソッドをオーバーライドできないようにするためのインターフェイスはどのように行われますか?

4

2 に答える 2

23

まず第一に、JavaDocsは、このメソッドを実装する必要があることを明確に説明しています:

さらに、このメソッドは、指定されたオブジェクトがコンパレーターでもあり、このコンパレーターと同じ順序を課す場合にのみ true を返すことができます。したがって、は、すべてのオブジェクト参照に対しておよびでcomp1.equals(comp2)あることを意味します。sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))o1o2

でもその後:

オーバーライドしないことは常に安全であることに注意してくださいObject.equals(Object)

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

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

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

于 2012-08-01T11:17:01.493 に答える
0

すべてのオブジェクトがすでに equals() を実装しているためです。

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

于 2012-08-01T22:43:01.807 に答える