equals и наследник с новым полем
Вопрос
Point(x, y) реализует equals через instanceof Point. Наследник ColorPoint добавил поле color и тоже сравнивает через instanceof ColorPoint плюс цвет. Что нарушено?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Рефлексивность: объект
colorPointперестаёт быть равен самому себе - Симметричность:
point.equals(cp)true, аcp.equals(point)falseправильный ответ - Ничего: каждый класс сравнивает свои поля, и это корректно
- Только
hashCode: он теперь не учитывает цвет, а equals корректен
Разбор
Point.equals считает ColorPoint подходящим (он instanceof Point) и сравнивает только x и y: true. ColorPoint.equals требует ColorPoint и получает false на обычном Point. Симметричность нарушена, коллекции начнут вести себя непредсказуемо. Решения: сравнивать через getClass() == o.getClass(), сделать классы final, или заменить наследование композицией. Рефлексивность при этом не страдает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.