如果我在两个子类

时间:2016-06-20 22:02:37

标签: java sorting inheritance comparator compareto

我试图重现此帖中提到的问题: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函数运行良好,但是它给了我一个奇怪的命令。

有人可以帮助我吗?感谢。

2 个答案:

答案 0 :(得分:5)

“比较方法违反其一般合同”异常是在尽力而为的基础上抛出的:如果排序算法看到任何明显的东西,它将抛出异常,但它不会做任何额外的努力测试你的比较方法。您可能只是对测试数据感到满意。

如果幸运的话,不要抛出异常是完全正常的,但是异常可能会在以后的任何时候出现。

答案 1 :(得分:1)

作为Collections.sort州的文档,此例外是可选的:

  

IllegalArgumentException - (可选)如果实现检测到列表元素的自然顺序违反了Comparable合同

实现不需要抛出它。

另请注意

  

实施说明:
      此实现遵循使用指定列表和空比较器的List.sort(Comparator)方法。

并且List.sort的文档包含相同的注释,即此例外是可选的。