“比较法违反了它的一般合同!”

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

为什么这段代码会抛出一个异常,“比较方法违反了它的一般契约!”,以及如何修复它?

private int compareParents(Foo s1, Foo s2) {
    if (s1.getParent() == s2) return -1;
    if (s2.getParent() == s1) return 1;
    return 0;
}
提问于
用户回答回答于

你的比较器不是传递性的。

A做父母B,和B做父母C,自A > BB > C,那么一定是这样的A > C.但是,如果比较器是在AC,它将返回零,意思是A == C,这违反了契约,因此引发异常。

这个库能检测到这一点,让你知道,而不是行为不正常,这是相当不错的。

中满足及物性要求的一种方法compareParents()是遍历getParent()而不是只看直接的祖先。

用户回答回答于

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

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

扫码关注云+社区