Меня просят исследовать ошибку в рамках моей стажировки. Кусок кода кидает
java.lang.IllegalArgumentException: метод сравнения нарушает свой общий контракт!
Пользовательский Comparator
сравнивает два пользовательских класса, просматривая long
переменных-членов указанного пользовательского класса:
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
Метод equals
для этого пользовательского класса просматривает переменную-член String
этого пользовательского класса. Мы чертовски долго воспроизводим поведение. Моей рефлекторной реакцией было заменить оператор return в пользовательском Comparator
на return v2.compareTo(v1);
, но моя команда сомневается, что это решит проблему. Может ли кто-нибудь предложить какое-либо понимание?
Arrays.sort(anArray, new Comparator<ACustomClass>() {
@Override
public int compare(ACustomClass o1, ACustomClass o2) {
long v1 = o1.getALong();
long v2 = o2.getALong();
return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
}});
Long.compare()
здесь? - person arshajii   schedule 08.08.2013Arrays.sort()
не выдает это исключение. - person user207421   schedule 08.08.2013Arrays.sort(...)
вызываетTimSort(...)
, который выдает это исключение. - person Dan Forbes   schedule 08.08.2013Arrays.sort(Object[])
(тот, который использует TimSort). Но это должно возникать только тогда, когда задействован естественный порядок (а не пользовательскийComparator
). - person Marko Topolnik   schedule 08.08.2013java.util.Arrays.useLegacyMergeSort
. Ссылка: Совместимость с Java 7; поиск по RFE: 6804124. - person Marko Topolnik   schedule 08.08.2013volatile
. - person ajb   schedule 08.08.2013