我正在使用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);
}
}
是的,这些行可以省略,因为对super.equals
的调用实际上将验证对象是否是同一个实例,或者它们是不是同一类型。
Just...be very careful about doing this at all with subclasses.这不是通常为继承类型做的事情,因为等价与is-a关系不同(例如,Dog
是-Animal
,但并非所有Animal
s都是Dog
s,并且定义它们的等价似乎都很奇怪;两只动物不一样,因为它们的眼睛是棕色的)。