“比较方法违反了其总合同!”
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;
}
有人可以用简单的术语解释我,为什么这个代码会抛出一个异常,“比较方法违反了它的总协定!”,我该如何修复它?
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 > B
B > C
A > C
A
C
A == C
库检测到这一点并让你知道,而不是表现得不稳定,这是相当不错的。
满足传递性要求的一种方法是遍历链,而不是只查看直接祖先。compareParents()
getParent()
只是因为这是我在谷歌上搜索这个错误时得到的,我的问题是我有
if (value < other.value)
return -1;
else if (value >= other.value)
return 1;
else
return 0;
实际上应该(显然)是这样的,这样你就可以用相等的对象返回0。value >= other.value
value > other.value