Это на самом деле поднимает сложный вопрос.Допустим, у вас есть класс Foo и два подкласса, FooA и FooB.Имеет ли смысл, в вашем приложении / домене , чтобы FooA когда-либо был равен Foo или FooB?
Если это так, вы должны реализовать equals в суперклассе.И тест на instanceof Foo
.По сути, любые дополнительные поля, добавленные в FooA или FooB, будут игнорироваться.Часто это правильно.Код выглядит следующим образом:
public boolean equals(Object o) { // perfectionists will make this final
if (this == o)
return true;
if (o instanceof Foo) { // note that Foo, FooA and FooB would all pass
Foo oFoo = (Foo)o;
// compare all the fields of Foo here
}
return false;
}
Если нет, вам нужно реализовать равенства в подклассах.И тест для классов будет равным, а не просто instanceof.например,
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null) // this extra check is needed to avoid a NPE
return false;
if (o.getClass() == this.getClass()) { // must be an exact match
FooA oFoo = (FooA)o;
// compare all the fields here
}
return false;
}
В целом, я думаю, что большинство людей используют первый подход.И это кажется наиболее подходящим для вашей проблемы.См. Эффективная Java Джоша Блоха.Вы найдете много сообщений по этому вопросу, например, Есть ли причина предпочитать getClass (), а не instanceof при генерации .equals ()?