Хорошо, у нас здесь есть пример из Эффективной Java (у меня есть 2-е издание 2008 г.).Пример приведен в ITEM 8: OBEY THE GENERAL CONTRACT WHEN OVERRIDING EQUALS
, начиная со страницы 37 (я пишу это на случай, если вы захотите проверить).
class ColoredPoint extends Point{}
, и есть 2 попытки показать, почему instanceof BAD.Первая попытка была
// Broken - violates symmetry!
@Override public boolean equals(Object o) {
if (!(o instanceof ColorPoint))
return false;
return super.equals(o) && ((ColorPoint) o).color == color;
}
, а вторая была
// Broken - violates transitivity!
@Override public boolean equals(Object o) {
if (!(o instanceof Point))
return false;
// If o is a normal Point, do a color-blind comparison
if (!(o instanceof ColorPoint))
return o.equals(this);
// o is a ColorPoint; do a full comparison
return super.equals(o) && ((ColorPoint)o).color == color;
}
Прежде всего, второй IF никогда не будет достигнут,Если 'o' не является точкой, которая является суперклассом для ColorPoint, как может случиться, что точка не будет ColorPoint ??????
Так что вторая попытка с начала неверна!Где единственный шанс для ИСТИННОГО сравнения - super.equals(o) && ((ColorPoint)o).color == color;
, которого недостаточно !!решение здесь будет следующим:
if (super.equals(o)) return true;
if (!(o instanceof ColorPoint))
if ((o instanceof Point)) return this.equals(o);
else return false;
return (color ==((ColorPoint)o).color && this.equals(o));
obj.getClass () используется для очень специфического equals (), но ваша реализация зависит от вашей области видимости.Как вы определяете, что два объекта равны или нет?Реализуйте его, и он будет работать соответственно.