一尘不染

Java-“比较法违反了它的总合同!”

java

有人可以简单地向我解释一下,为什么此代码会引发异常,“比较方法违反了它的一般约定!”,我该如何解决?

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

阅读 387

收藏
2020-02-25

共1个答案

一尘不染

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

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

该库可以很好地检测到这一点并让你知道,而不是行为不规律。

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

2020-02-25