Независимо от того, являются ли объекты объектами и / или загружены с отложенной загрузкой, практически невозможно соблюдать контракт равных и иметь специализацию равных в подклассе, который использует instanceof.В самом деле, вы бы оказались в ситуации, когда у вас будет b1.equals(c1) == true
, но c1.equals(b1) == false
.
Итак, я думаю, что суперкласс (B) должен определить равенства и сделать его окончательным, потому что все подклассыследует использовать метод базового класса equals
.
Тем не менее, ваш метод equals в B неверен:
if (!super.equals(obj)) {
return false;
}
Это означает, что реализация объекта equals должна возвращать true дляиметь два равных экземпляра B.Это означает, что два экземпляра B равны, только если они являются одним и тем же объектом.
if (!(obj instanceof C)) {
return false;
}
Почему класс B проверяет, является ли другой экземпляр экземпляром C. Он должен проверять, является ли другой экземплярэкземпляр B.
Так как в конце два B равны, если они имеют одинаковый идентификатор, и, так как идентификаторы должны быть уникальными для всего дерева наследования, вы в безопасности, если вы сделаете этот метод equals окончательным.