8

如果我在父类和子类中都实现equals()hashCode()是否有必要在子类中调用super.equals()equals()例如

public boolean equals(Object obj) {

  if (obj.getClass() != ChildClass.class) {
    return false;
  }

  return super.equals() && this.var == ((ChildClass) obj).var;

}

我假设父类不是 Object 并且给出了 equals 和 hashCode 的正确定义。

4

2 回答 2

8

不,这没有必要,而且可能是错误的。确实,您重写的部分原因equal是因为super.equals没有给出正确的行为(对吗?)。

或者换一种说法,如果super.equals给出正确的行为,你可能不需要去覆盖它的麻烦。

但是,如果您要覆盖equals,那么是的,您也需要覆盖hashCode

于 2012-04-20T21:26:59.557 回答
2

如果您的超类没有实现 equals,那么调用 super.equals 将为您提供仅比较引用的 Object 实现,因此在您想要比较业务密钥的任何普通 equals 实现中,它实际上会导致很多误报。

也就是说,您上面的实现在语义上实际上与 Object 中的默认 equals 实现没有任何不同,因为您只是==用于比较。

至于 hashCode,如果你覆盖 equals 你真的应该覆盖 hashCode 以保持两者的合同。例如,如果您将业务密钥用于等于,您可能应该对哈希码使用相同的业务密钥,以便两个相等的对象生成相同的哈希码。

于 2012-04-20T21:24:54.960 回答