Я смотрю какой-то унаследованный код, и я нашел раздел, который вызывает у меня ошибку «Сравнительный метод нарушает общий контракт!». Я понимаю, что эта ошибка является результатом того, что код не является транзитивным, но я не совсем понимаю, как правильно его исправить.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());
}
});
}
Первоначально код использует ==
, а не equals()
при сравнении строк getDisease()
и getFamilyMembers()
. Я думал, что внесение изменений с ==
в equals()
устранит проблему, но это не тот случай.
вы должны проверить o1.getDise ase() равно null или нет до сравнения os.getDisease(), равно ли o2.getDisease() – haifzhan
. '==' была оптимизацией. Две строки ниже, 'o2.getFamilyMembers(). CompareTo (o2.getFamilyMembers())! = 0' делает реальную работу. Поэтому '== 1 * был * правильным (и избыточным). –
@HaifengZhang Я пробовал это, в дополнение к перемещению еще одной нулевой проверки, но я все еще получаю ошибку. Я опубликовал свой обновленный код выше. –