【问题标题】:what would happen if I override compareTo() differently in two children class如果我在两个子类中以不同方式覆盖 compareTo() 会发生什么
【发布时间】:2016-06-20 22:02:37
【问题描述】:

我正在尝试重现这篇文章中提到的问题:Comparison method violates its general contract

我所做的是创建一个父类 A,它有自己的 compareTo() 函数,然后我创建了一个从类 A 继承的类 B,并覆盖了 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() 对它们进行排序,但是我没有看到上一篇文章中提到的异常,排序函数运行良好,但它给出了我一个奇怪的命令。

有人可以帮我吗?谢谢。

【问题讨论】:

  • 你如何期望这种排序工作?坦率地说,覆盖compareTo 听起来它天生注定要失败。
  • @LouisWasserman 哦,实际上我试图重现该帖子中提到的问题,我认为我覆盖 compareTo 的方式应该重现异常,但它没有。
  • 您甚至无法保证该异常会出现在任何给定的测试数据中,甚至根本无法保证,具体取决于您的 Java 版本。

标签: java sorting inheritance comparator compareto


【解决方案1】:

尽力而为抛出“比较方法违反其一般约定”异常:如果排序算法发现任何明显的东西,它会抛出异常,但不会做任何额外的事情努力测试你的比较方法。您可能只是幸运地获得了测试数据。

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

【讨论】:

  • 谢谢,我觉得这对我有意义。
【解决方案2】:

正如Collections.sort 的文档所述,此异常是可选的:

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

实现不需要抛出它。

还要注意

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

List.sort 的文档包含相同的注释,即此异常是可选的。

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多