另一种"比较方法违反了其总合同!"

Dan*_*bes 1 java comparator illegalargumentexception java-7

作为实习的一部分,我被要求调查一个错误.一段代码正在抛出

java.lang.IllegalArgumentException:比较方法违反了它的一般合同!

自定义Comparator是通过查看long所述自定义类的成员变量来比较两个自定义类:

return v1 > v2 ? -1 : v1 < v2 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

equals此自定义类的方法查看此自定义类的String成员变量.我们有一段时间重现这种行为.我下意识的反应是代替return语句在自定义Comparatorreturn 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;
  }});
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 6

我看不出比较器出现的明显错误.(而且我对提议的修正案持怀疑态度:他们"嗅到"伏都教编程对我来说.)

但是如果ACustomClass类的aLong属性是可变的...... 并且在排序时它发生了变化 ......那么这可能会导致排序代码认为比较器违反了合同.

所以...检查这是否是一个并发问题,其中一个线程正在改变另一个线程试图排序的数组中的对象.


我们花了很多时间在这个调试器上......很多不同的测试用例.无法获得要复制的行为.

我认为这是指出并发问题的证据......