1. ホーム
  2. java

[解決済み】"比較メソッドはその一般契約に違反する!"

2022-01-19 15:04:40

質問

このコードが例外を投げる理由、"比較メソッドが一般契約に違反している!"、そしてそれを修正する方法を誰か分かりやすく説明してください。

private int compareParents(Foo s1, Foo s2) {
    if (s1.getParent() == s2) return -1;
    if (s2.getParent() == s1) return 1;
    return 0;
}

解決方法は?

コンパレータが他動的でない。

とする。 A の親である B であり、かつ B の親となる。 C . というのも A > BB > C ということになるのでしょう。 A > C . しかし,コンパレータが AC の場合、ゼロを返します。 A == C . これは契約に違反するため、例外がスローされます。

このような異常な振る舞いをするのではなく、それを検知して知らせてくれるのは、むしろライブラリーの良いところです。

の推移性要件を満たす1つの方法として compareParents() をトラバースすることです。 getParent() の連鎖を、直系の先祖だけを見るのではなく、その先の先祖を見るようにします。