#java #преобразование_типов
Доброго времени суток. В методе 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(); } }
Ответы
Ответ 1
Вообще то, конструкция вида PairOther = (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") для вас. Она избавляет от этих назойливых предупреждений во время компиляции. Ответ 2
@Override public boolean equals(Object other) { boolean result = false; if (other != null && other instanceof Pair) { Pair otherPair = (Pair) other; if (otherPair.getFirst() istanceof T && otherPair.getSecond() instaceof U) { T otherFirst = (T)otherPair.getFirst(); U otherSecond = (U)otherPair.getSecond(); result = first.equals(otherFirst) && second.equals(otherSecond); } } return result; }
Комментариев нет:
Отправить комментарий