有人可以用简单的术语解释我,为什么此代码会引发一个例外:“比较方法违反了它的一般合同!",我该如何解决?

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

答案

Your comparator is not transitive.

A成为父母B, 和B成为父母CA > BB > C,那一定是A > C。但是,如果您的比较器被调用AC,它将返回零,意思是A == C。这违反了合同,因此引发了例外。

图书馆的检测并让您知道,而不是不正当。

满足传递性要求的一种方法compareParents()是穿越getParent()链,而不仅仅是看直接的祖先。

来自: stackoverflow.com