3

Javadoc がわかりません:

The natural ordering for a class C is said to be consistent with equals if and only if
  (e1.compareTo((Object)e2) == 0) has the same boolean value as e1.equals((Object)e2) for
  every e1 and e2 of class C.

なぜそのようにする必要がありますか?

e1.equals(e2)=true は常に e1.compareTo(e2)==0 を意味する必要があることは理解していますが、反対が真である理由がわかりません。比較は平等ではない!2 つの等しいオブジェクトは 0 と比較する必要がありますが、2 つの異なるオブジェクトは、並べ替えの基準が該当しない場合は 0 と比較できる必要があります。つまり、異なるオブジェクトを等しくすることは正しくありませんが、比較が 0 の異なるオブジェクトがあるのはなぜでしょうか?

編集:後で、いくつかの互換性の問題のために、一貫性が強く推奨されると述べているため、質問

4

4 に答える 4

7

その Javadoc は、equals と一致しない比較を行うことが間違っていると言っているわけではありません。equals と一致する比較の用語を定義しているだけです。

選択肢が得られた場合、通常は、A と B が与えられたときに、A が B より小さいか、等しいか、または大きいかのように、equals と一致する比較を行うのが適切ですが、そのように機能する必要はありませ

ただし、これを文書化すること重要です。呼び出し元は、equals と予期せず一致しない順序で非常に混乱する可能性があります。

于 2012-05-31T12:32:27.970 に答える
3

彼らは自然な秩序について話しているだけです。別の種類の注文をしている可能性があります

于 2012-05-31T12:32:43.200 に答える
0

例として、 BigDecimalクラスについて考えてみます。このクラスでは、メソッドはequalsであり、compareToは相互に一貫していません。

等しいドキュメントには次のように書かれています。

public boolean equals(Object x)

このBigDecimalを指定されたオブジェクトと比較して同等です。compareToとは異なり、このメソッドは、値とスケールが等しい場合にのみ2つのBigDecimalオブジェクトが等しいと見なします(したがって、このメソッドで比較した場合、2.0は2.00と等しくありません)。

于 2012-05-31T12:36:37.623 に答える
0

Java doc では、自然順序付けについて説明しています。それ以外は自由に比較してください。でもそれが自然な秩序に関するものなら、それは双方向でなければならないと思いませんか?

1 日 50 か月経っても、整数の自然な順序が逆になることはありません ;)

于 2012-05-31T12:33:14.983 に答える