子类中的等于方法

时间:2019-03-15 02:21:37

标签: java intellij-idea

我正在使用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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

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