问题的作者说答案是D,但我想知道为什么答案不应该是C?
问:关于可以填空的代码,哪种说法正确?
class Sticker {
public int hashCode() {
return 1;
}
public boolean equals(Object o) {
return____________ ;
}
}
A。它必须返回false。
B.必须返回true。
C.它可以返回true或false。
D.以上都不是。
编辑1 :
作者给出的答案和解释如下: 如果一个类的两个实例具有相同的哈希码,则它们可能相等,也可能不相等。反之则不成立。如果两个对象相等,则它们必须具有相同的哈希码,以便遵守这些方法的约定。但是,在这种情况下,答案并非以上所有,因为该方法不能简单地返回true或false。根据equals()的规则,如果传入null,则结果必须为false。如果传入对象标识,则由于反射性,结果必须为true。结果,选项D是正确的。
编辑2 :
可能是作者通过上面给出的解释表示以下内容:
我想可能是作者想说的是,如果我们从true
返回equals(Object)
,那么在这种情况下,有人可能会在null
中通过equals(Object)
基于传递的true
参数,返回值null
将与返回值相矛盾,返回值应为false
而不是true
。同样,如果我们返回false
,则很可能传递了Sticker
对象标识,这又将导致矛盾。因此,基本上我们不能用true
或false
来填补空白。也许就是为什么作者说答案是D。
答案 0 :(得分:3)
作者的回答选项写得不好。从他们的解释很明显,他们的答案选择最好写成:
A。它应该始终返回false。 B.它应始终返回true。 C.返回true或返回false总是正确的。 D.以上都不是。
该问题可能还受益于重写:
假设代码中的空白正确地满足了equals()方法的约定,那么下面哪条语句始终是正确的?
作者对计算机科学犯下了两项严重罪行