Вы, вероятно, делаете что-то вроде этого:
public class Foo {
// some code
public void equals(Object o) {
Foo other = (Foo) o;
// the real equals code
}
}
В этом примере вы предполагаете что-то об аргументе equals (): вы предполагаете, что он имеет тип Foo. Это не должно быть дело! Вы также можете получить строку (в этом случае вы почти наверняка должны вернуть false).
Итак, ваш код должен выглядеть так:
public void equals(Object o) {
if (!(o instanceof Foo)) {
return false;
}
Foo other = (Foo) o;
// the real equals code
}
(или используйте более строгий getClass() != o.getClass()
, упомянутый Дэйвом Л.
Вы также можете посмотреть на это так:
Integer i = new Integer(42);
String s = "fourtytwo";
boolean b = i.equals(s);
Есть ли причина, по которой этот код должен выдавать ClassCastException
вместо обычного завершения и устанавливать b
в false
?
Бросок ClassCastException
в ответ на .equals()
не будет разумным. Потому что, даже если это глупый вопрос («Конечно, строка никогда не равна Foo!»), Он все равно остается верным с совершенно точным ответом («нет» == false
).