我正在使用IntelliJ自动为以下两个类生成equals
和hashCode
函数。我在Dog
类的equals
方法中发现了
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
由于这两行都在父类中,所以应该省略吗?我以为在调用super.equals()
时,这些检查将在父类中进行。
class Animal{
String eye;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Animal animal = (Animal) o;
return Objects.equals(eye, animal.eye);
}
@Override
public int hashCode() {
return Objects.hash(eye);
}
}
class Dog extends Animal{
String hair;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
Dog dog = (Dog) o;
return Objects.equals(hair, dog.hair);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), hair);
}
}
答案 0 :(得分:0)
是的,可以省略这些行 ,因为对super.equals
的调用实际上将验证这些对象是同一实例还是它们不是同一类型。>
Just...be very careful about doing this at all with subclasses.对于继承类型,这不是通常要做的事情,因为等效性与 is-a 关系(例如,Dog
是- Animal
,但并非所有Animal
都是Dog
,并且为它们定义等价关系似乎很奇怪;两只动物并不相同,因为它们的眼睛是棕色的)。