“比较法违反了它的总契约!”

新手上路,请多包涵

有人可以简单地解释一下,为什么这段代码会抛出异常,“比较方法违反了它的一般契约!”,我该如何解决?

 private int compareParents(Foo s1, Foo s2) {
    if (s1.getParent() == s2) return -1;
    if (s2.getParent() == s1) return 1;
    return 0;
}

原文由 n00bster 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 291
2 个回答

您的比较器不是可传递的。

A B B 成为 C 由于 A > BB > C ,那么它一定是 A > C 。但是,如果在 AC 上调用比较器,它将返回零,即 A == C 。这违反了合同,因此抛出异常。

图书馆很高兴检测到这一点并让您知道,而不是行为不稳定。

满足 compareParents() 中传递性要求的一种方法是遍历 getParent() 链,而不是只查看直接祖先。

原文由 NPE 发布,翻译遵循 CC BY-SA 3.0 许可协议

仅仅因为这是我用谷歌搜索这个错误时得到的,我的问题是我有

if (value < other.value)
  return -1;
else if (value >= other.value)
  return 1;
else
  return 0;

value >= other.value 应该(显然)实际上是 value > other.value 这样你就可以用相等的对象返回 0。

原文由 you786 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题