Страницы

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

четверг, 23 января 2020 г.

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

#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



Вообще то, конструкция вида 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") для вас. Она избавляет от этих назойливых предупреждений во время компиляции.

Ответ 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; }

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

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