метод equals в универсальном классе Java - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть универсальный класс ArrayBag.Я хочу переопределить метод равно.Итак, я написал

public boolean equals(T other){

} // gives error

сообщение об ошибке: Столкновение имени: Метод equals (T) типа ArrayBag имеет такое же стирание, что и equals (Object) типа Object, но не переопределяет его

Ответы [ 4 ]

6 голосов
/ 24 ноября 2011

Метод equals, который вы пытаетесь переопределить, ожидает Object. Когда ваш код переведен в байт-код, тип erasure преобразует ваш T в Object, что противоречит существующему методу equals.

@Override
public boolean equals(Object other) {
    if (other instanceof T)
    {
        T o = (T) other;
        ...
    }
}

Внутри метода вы можете обрабатывать приведение к T.

2 голосов
/ 24 ноября 2011

Замените equals(T other) на equals(Object other), а затем приведите other к T внутри реализации метода.

public boolean equals(Object other)
{
    T t = (T) other;
    // ...
}
0 голосов
/ 14 мая 2015

Каждый раз, когда вам нужно переопределить метод, подпись должна совпадать с методом, который нужно переопределить. Поэтому вы должны передать Object в качестве единственного аргумента в ваш метод equals, чтобы он функционировал должным образом.

В качестве альтернативы твердому решению Грэнтэма вы можете использовать getClass () вместо instanceof, если, например, вы планируете расширить свой универсальный класс и не хотите, чтобы экземпляры подкласса когда-либо равнялись вашим экземплярам суперкласса.

Это будет выглядеть так:

@Override
public boolean equals(Object other) {
    if (other != null && getClass() == other.getClass()) {
        T o = (T) other;

        // ...

    }
    return false;
}
0 голосов
/ 24 ноября 2011

тебе это нужно.

public boolean equals(Object other){
      T t = (T) other;

}
...