Вы не переопределяете equals
, вы перегружаете это (то же имя метода, другая подпись). Для корректного переопределения equals
из Object
необходимо соответствовать сигнатуре метода. Это означает, что ваш equals
метод должен принимать Object
, а не Person
.
public boolean equals(Object o) { // ...
Рекомендуется включать аннотацию @Override
в любой метод, предназначенный для переопределения метода из суперкласса или реализации метода из интерфейса. Если бы вы сделали это, компилятор предупредил бы вас о том, что ваш метод не переопределил equals
.
@Override
public boolean equals(Object o) { // ...
Это также означает, что вам нужно проверить, является ли переданный объект на самом деле Person
перед приведением и сравнением значений членов.
Рекомендуется также переопределить hashCode
, чтобы оно соответствовало equals
, согласно hashCode
контракту .