子类中的等于方法

问题描述 投票:0回答:1

我正在使用IntelliJ自动生成equalshashCode函数,用于以下两个类。我发现在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);
    }
}
java intellij-idea
1个回答
0
投票

是的,这些行可以省略,因为对super.equals的调用实际上将验证对象是否是同一个实例,或者它们是不是同一类型。

Just...be very careful about doing this at all with subclasses.这不是通常为继承类型做的事情,因为等价与is-a关系不同(例如,Dog是-Animal,但并非所有Animals都是Dogs,并且定义它们的等价似乎都很奇怪;两只动物不一样,因为它们的眼睛是棕色的)。

© www.soinside.com 2019 - 2024. All rights reserved.