“比较方法违反了其总合同!”

2022-08-31 06:05:00

有人可以用简单的术语解释我,为什么这个代码会抛出一个异常,“比较方法违反了它的总协定!”,我该如何修复它?

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

答案 1

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

设为 的父级,并成为 的父级。既然和,那么一定是这种情况。但是,如果在 和 上调用比较器,它将返回零,即 .这违反了协定,因此会引发异常。ABBCA > BB > CA > CACA == C

库检测到这一点并让你知道,而不是表现得不稳定,这是相当不错的。

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


答案 2

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

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

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


推荐