Метод Equals в дочернем классе - PullRequest
0 голосов
/ 15 марта 2019

Я использую IntelliJ для автоматического создания функций equals и hashCode для следующих двух классов. Я нашел в методе Dog class '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 голосов
/ 15 марта 2019

Да, эти строки могут быть пропущены , поскольку вызов super.equals действительно будет проверяться, если объекты имеют одинаковый экземпляр, или если они не одного типа.

Просто ... будьте очень осторожны, чтобы делать это вообще с подклассами. Это не то, что обычно делается для унаследованных типов, поскольку эквивалентность не совпадает с is-a отношение (например, Dog is-an Animal, но не все Animal s Dog s, и определение эквивалентности для них всех кажется странным ; два животных не одинаковы, потому что их глаза коричневые).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...