我试图重现此帖中提到的问题:Comparison method violates its general contract
我所做的是创建一个父类A,它有自己的compareTo()函数,然后我创建了一个类B继承自类A,并覆盖compareTo(),如:
public int compareTo(Object o) { return super.compareTo(o);}
另一个C类也继承自A类,并将compareTo()重写为:
public int compareTo(Object o) { return -super.compareTo(o);}
所以我列出了一堆B / C类对象,并使用Collections.sort()对它们进行排序,但是我没有看到前一篇文章中提到的Exception,sort函数运行良好,但是它给了我一个奇怪的命令。
有人可以帮助我吗?感谢。
答案 0 :(得分:5)
“比较方法违反其一般合同”异常是在尽力而为的基础上抛出的:如果排序算法看到任何明显的东西,它将抛出异常,但它不会做任何额外的努力测试你的比较方法。您可能只是对测试数据感到满意。
如果幸运的话,不要抛出异常是完全正常的,但是异常可能会在以后的任何时候出现。
答案 1 :(得分:1)
作为Collections.sort州的文档,此例外是可选的:
IllegalArgumentException - (可选)如果实现检测到列表元素的自然顺序违反了Comparable合同
实现不需要抛出它。
另请注意
实施说明:
此实现遵循使用指定列表和空比较器的List.sort(Comparator)方法。
并且List.sort的文档包含相同的注释,即此例外是可选的。