Java:equals和hashCode方法契约

问题描述 投票:-2回答:1

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

问:关于可以填空的代码,哪个陈述是正确的?

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

A.它必须返回false。 B.必须回归真实。 C.它可以返回true或false。 D.以上都不是。


编辑1:

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


编辑2:可能是作者的意思如下以上给出的解释:我想可能是作者想说如果我们从true返回equals(Object)然后有可能有人可以通过nullequals(Object)在这种情况下它将与返回值true相矛盾,因为基于null论证被传递的返回值应该是false而不是true。同样地,如果我们返回false,那么有可能传递Sticker对象身份,然后它将再次相互矛盾。所以基本上我们不能用truefalse填补空白。可能这就是为什么作者说答案是D.

java equals hashcode
1个回答
3
投票

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

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

问题也可能从重写中受益:

假设填充空白的代码正确地满足了equals()方法的约定,下面哪个语句总是如此?

提交人犯了两项严重违反计算机科学的行为

  1. 关键字违规。 'return'是一个关键字,当你真正意味着'正确回归'时,使用'return'是非常愚蠢的。 Sentence =必须尝试向一个300人的新生类解释指针逻辑这种特殊的违规行为使得它如此难以理解,因为布尔函数显然可以返回true或false。
  2. 布尔逻辑违规。布尔可以是真的还是假的。因此,返回布尔值的函数可以始终返回true,总是返回false,或者有时返回一个,有时返回另一个。给布尔问题提供4个答案选择是违反布尔值的本质。滥用关键字“返回”会加剧这种违规行为,但这本身就属于犯罪行为。 Sentence = C ++中的对程序,有一个实习生,其唯一的CS教育是React训练营
© www.soinside.com 2019 - 2024. All rights reserved.