小编典典

“比较法违反了它的总契约!”

all

有人可以简单地解释一下,为什么这段代码会抛出异常,“比较方法违反了它的一般合同!”,我该如何解决?

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

阅读 91

收藏
2022-06-27

共1个答案

小编典典

您的比较器不是可传递的。

让我们A成为 的父母B,并B成为 的父母C。既然A > BB > C,那么它一定是这样的A > CA但是,如果在and上调用您的比较器C,它将返回零,即A == C。这违反了合同,因此引发了异常。

图书馆很高兴能检测到这一点并让你知道,而不是表现得不规律。

满足传递性要求的一种方法compareParents()是遍历getParent()链而不是只查看直接祖先。

2022-06-27