猿问

“比较法违反了它的一般合同!”

“比较法违反了它的一般合同!”

有人能简单地解释一下吗?为什么这段代码会抛出一个异常,“比较方法违反了它的一般契约!”,以及如何修复它?

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


慕姐8265434
浏览 447回答 3
3回答

扬帆大鱼

你的比较器不是传递性的。放任A做父母B,和B做父母C..自A > B和B > C,那么一定是这样的A > C..但是,如果您的比较器是在A和C,它将返回零,意思是A == C..这违反了契约,因此引发异常。库能检测到这一点并让您知道这一点,而不是行为不规范,这是相当不错的。中满足传递性要求的一种方法compareParents()是遍历getParent()链而不是只看直接的祖先。

青春有我

就因为这就是我在谷歌搜索这个错误时得到的,我的问题是if&nbsp;(value&nbsp;<&nbsp;other.value) &nbsp;&nbsp;return&nbsp;-1;else&nbsp;if&nbsp;(value&nbsp;>=&nbsp;other.value) &nbsp;&nbsp;return&nbsp;1;else &nbsp;&nbsp;return&nbsp;0;这个value >= other.value(显然)应该是value > other.value这样你就可以用相同的对象返回0。

撒科打诨

违反合同通常意味着比较国在比较对象时没有提供正确或一致的值。例如,您可能希望执行字符串比较,并强制空字符串排序到最后:if&nbsp;(&nbsp;one.length()&nbsp;==&nbsp;0&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;empty&nbsp;string&nbsp;sorts&nbsp;last}if&nbsp;(&nbsp;two.length()&nbsp;==&nbsp;0&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;empty&nbsp;string&nbsp;sorts&nbsp;last&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}return&nbsp;one.compareToIgnoreCase(&nbsp;two&nbsp;);但这会忽略一和二都是空的情况-在这种情况下,返回错误的值(1,而不是0,以显示匹配),比较器报告为违规。它应该写成:if&nbsp;(&nbsp;one.length()&nbsp;==&nbsp;0&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;two.length()&nbsp;==&nbsp;0&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;BOth&nbsp;empty&nbsp;-&nbsp;so&nbsp;indicate &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;empty&nbsp;string&nbsp;sorts&nbsp;last}if&nbsp;(&nbsp;two.length()&nbsp;==&nbsp;0&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;empty&nbsp;string&nbsp;sorts&nbsp;last&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}return&nbsp;one.compareToIgnoreCase(&nbsp;two&nbsp;);
随时随地看视频慕课网APP

相关分类

Java
我要回答