Страницы

Поиск по вопросам

среда, 13 марта 2019 г.

Приведение типов из object

Доброго времени суток. В методе equals не работает приведение типов. В чем проблема?
class Pair { private T first; private U second; public Pair() { first = null; second = null; } public Pair(T f, U s) { first = f; second = s; } public void setFirst(T arg) { first = arg; } public void setSecond(U arg) { second = arg; } public T getFirst() { return first; } public U getSecond() { return second; } public String toString() { return first.toString()+" "+second.toString(); } @Override public boolean equals(Object other) { if (other == null) return false; if (getClass()!=other.getClass()) return false; if (this == other) return true; Pair Other = (Pair) other; //эта строка не работает if (getFirst().equals(Other.getFirst())&&getSecond().equals(Other.getSecond())) return true; return false; } @Override public int hashCode() { return 3*getFirst().hashCode()-4*getSecond().hashCode(); } }


Ответ

Вообще то, конструкция вида
Pair Other = (Pair) other;
не является корректной, т.к. в райнтайме дженерики стираются. Вместо U, T у полей будет тип Object. Естественно компилятор пытается предупредить вас о возможной ошибке. Но вы можете проверить, является ли данный объект типом Pair, а затем проверить каждое поле на равенство либо, сопоставимость типов:
@Override public boolean equals(Object other) { if (other == null) return false; if (this == other) return true;
if (!(other instanceof Pair)) return false;
Pair obj = (Pair) other; if (Objects.equals(obj.first, this.first) && Objects.equals(obj.second, this.second)) return true;
return false; }
Но если вы точно знаете и совершенно уверены в том, что делаете то аннотация @SuppressWarnings("unchecked") для вас. Она избавляет от этих назойливых предупреждений во время компиляции.

Комментариев нет:

Отправить комментарий