2016-06-20 1 views
1

私はこの記事で言及した問題を再現しようとしている:Comparison method violates its general contract私は2人の子供で異なる)のcompareToを(上書きする場合に何が起こるか、クラス

私はそれが自身のcompareToのしている親クラスAを、作っている何()関数は、その後、私が作ったクラスB、クラスAから継承など)(のcompareToをオーバーライド:

public int compareTo(Object o) { return super.compareTo(o);} 

及びcは、クラスAから継承別のクラスとして)(のcompareToをオーバーライド:

public int compareTo(Object o) { return -super.compareTo(o);} 

私はB/Cクラスのクラスのオブジェクトのリストを作成し、Collections.sort()を使ってそれらをソートしましたが、前の記事で説明したExceptionは表示されませんでした。変な注文。

誰かが私に助けてくれますか?ありがとう。

+0

どのように注文しても効果が期待できますか? 'compareTo'をオーバーライドすることは、本質的に失敗に終わったように率直に聞こえます。 –

+0

@LouisWassermanああ、実際に私はその記事で言及された問題を再現しようとしていましたが、私はcompareToがExceptionを再現すべきだと思っています。 – hj690

+0

Javaのバージョンによっては、その例外が任意のテストデータに表示されることがあります。 –

答えて

5

ベストプラクティスで例外がスローされます。:ソートアルゴリズムに何かが明白に見える場合は例外がスローされますが、テストするための余分な作業はありません比較方法。テストデータで幸運に思っているかもしれません。

幸運なことに例外がスローされないことは完全に正常ですが、その例外は後で表示されることがあります。

Collections.sort状態のドキュメントとして
+0

ありがとう、私はこれが私にとって意味をなさないと思う。 – hj690

1

、この例外はオプションです:

例外:IllegalArgumentException - 実装は、リストの要素の自然順序付けが同等の契約

に違反することが判明していることを検出した場合(オプション)

実装する必要はありません。
この実装は、指定されたリストとヌルコンパレータを使用してはlist.sort(コンパレータ)メソッドに延期:

はまた

実装ノートがあることに注意してください。

List.sortのドキュメントには、この例外がオプションであることと同じメモが含まれています。

+0

はい、私はあなたが正しいと思います。 – hj690

関連する問題