有人可以简单地解释一下,为什么这段代码会抛出异常“比较方法违反了其一般契约!”,以及如何修复它?
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()
链,而不是仅查看直接祖先。
关于java - "Comparison method violates its general contract!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58240140/