Java:equals 和 hashCode 方法合约



问题的作者说答案是D,但我想知道为什么答案不应该是C??

问:关于可以填空的代码,哪一种说法是正确的?

class Sticker {
public int hashCode() {
return 1;
}
public boolean equals(Object o) {
return____________ ;
}
}

一个。它必须返回 false。
B.它必须返回 true。
C. 它可以返回 true 或 false。
D. 以上都不是。


编辑 1

作者对此给出的答案和解释如下: 如果类的两个实例具有相同的哈希代码,则它们可能相等,也可能不相等。反之则不然。如果两个对象相等,则它们必须具有相同的哈希码才能符合这些方法的约定。但是,在这种情况下,答案不是上述任何一项,因为该方法不能简单地返回 true 或 false。根据 equals(( 的规则,如果传入 null,则结果必须为 false。如果传入对象标识,则由于反身性,结果必须为 true。因此,选项 D 是正确的。


编辑2: 作者在上面给出的解释中可能是指以下意思: 我认为作者可能想说,如果我们从equals(Object)返回true,那么有可能有人可能会在equals(Object)中传递null,在这种情况下,它将与返回值true相矛盾,因为基于传递null参数,返回值应该是false而不是true。同样,如果我们返回false则有可能传递Sticker对象标识,然后它将再次矛盾。所以基本上我们不能真正用truefalse来填补空白。也许这就是为什么作者说答案是D。

作者写得很差。从他们的解释中可以清楚地看出,他们的答案选择最好写成:

一个。它应始终返回 false。B.它应始终返回 true。C. 返回 true 或返回 false 总是正确的。D. 以上都不是。

重写也可能使该问题受益:

假设填空的代码正确履行了 equals(( 方法的合约,下面的哪句话总是正确的?

作者对计算机科学犯下了两项严重违法行为

  1. 关键字违规。"返回"是一个关键字,当您真正表示"正确返回"时,使用"返回"是非常愚蠢的。句子 =必须尝试向 300 人的新生解释指针逻辑这种特殊的违规行为使它如此难以理解,因为布尔函数显然可以返回真或假。
  2. 布尔逻辑冲突。布尔值可以是真或假。因此,返回布尔值的函数可以始终返回 true、始终返回 false,或者有时返回一个,有时返回另一个。给一个布尔问题4个答案选项是违反布尔值本质的。滥用"返回"一词使这种违法行为更加复杂,但就其本身而言,这应该是一种犯罪。句子 = 与实习生C++配对计划,实习生唯一的 CS 教育是 React 训练营

相关内容

  • 没有找到相关文章

最新更新