谁能简单解释一下,为什么这段代码会抛出异常,“比较方法违反了它的一般约定!”,我该如何解决?
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
。这违反了契约(Contract),因此引发了异常。
图书馆很高兴能检测到这一点并让你知道,而不是行为不规律。
满足 compareParents()
中传递性要求的一种方法是遍历 getParent()
链,而不是只查看直接祖先。
关于java - "Comparison method violates its general contract!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8327514/