有人可以简单地解释一下,为什么这段代码会抛出异常,“比较方法违反了它的一般契约!”,我该如何解决?
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 许可协议
有人可以简单地解释一下,为什么这段代码会抛出异常,“比较方法违反了它的一般契约!”,我该如何解决?
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 许可协议
8 回答6.4k 阅读
1 回答4.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
3 回答1.7k 阅读✓ 已解决
1 回答2k 阅读✓ 已解决
您的比较器不是可传递的。
A
B
B
成为C
由于A > B
和B > C
,那么它一定是A > C
。但是,如果在A
和C
上调用比较器,它将返回零,即A == C
。这违反了合同,因此抛出异常。图书馆很高兴检测到这一点并让您知道,而不是行为不稳定。
满足
compareParents()
中传递性要求的一种方法是遍历getParent()
链,而不是只查看直接祖先。