いくつかのレガシーコードを見ていて、「比較メソッドが一般的な契約に違反しています」というエラーが表示されるセクションが見つかりました。私は、このエラーは推移的ではないコードの結果だと理解していますが、正しく修正する方法を完全には理解していません。Java:IllegalArgumentException
ここにエラーの原因となるコードがあります。
private void sortHistories(List<History> histories) {
Collections.sort(histories, new Comparator<History>() {
@Override
public int compare(History o1, History o2) {
return o1 == o2 ? 0
: o1 == null ? -1
: o2 == null ? 1
: o1.getFamilyMembers().equals(o2.getFamilyMembers()) ? 0 //getFamilyMembers() returns a string
: o1.getFamilyMembers() == null ? -1
: o2.getFamilyMembers() == null ? 1
: o2.getFamilyMembers().compareTo(o2.getFamilyMembers()) != 0 ?
o2.getFamilyMembers().compareTo(o2.getFamilyMembers())
: o1.getDisease().equals(o2.getDisease()) ? 0 //getDisease() also returns a string
: o1.getDisease() == null ? -1
: o2.getDisease() == null ? 1
: o1.getDisease().compareTo(o2.getDisease());
}
});
}
文字列getDisease()
とgetFamilyMembers()
を比較するときもともと、コードが==
ではなくequals()
を使用していました。私は==
からequals()
に変更すると問題は解決すると思ったが、そうではない。
あなたはo1.getDiseをチェックする必要がos.getDisease()をo2.getDisease()と比較するかどうかを比較する前にase()がnullに等しいかどうかを確認します。 – haifzhan
'=='が最適化されました。下の2行、 'o2.getFamilyMembers().computTo(o2.getFamilyMembers())!= 0'は実際の作業を行います。だから '== 1 *は正しかった(そして冗長であった)。 –
@HaifengZhang別のヌルチェックを移動するだけでなく、これを試しましたが、まだエラーが発生しています。私は上記の私の更新されたコードを掲載しました。 –