Приведение объектов к типу ‹T›

Я реализую интерфейс List для класса, который хранит данные в массиве типа <T>. Это вызывает проблемы с методами, которые принимают коллекцию в качестве параметров, поскольку коллекция хранит свои объекты как Object. Как я могу преобразовать Object в T? Простое литье не работает.

class MyCollection<T> implements List<T>{
    T[] tab;

    MyCollection() {
        this.tab = (T[])new Object[10];
    }

    public boolean addAll(Collection c){
        for(Object o : c){
            o = (T)o;
            for(int i = 0; i < tab.length; i++){
                tab[i] = o;
            }
        }
    }

}

Я стараюсь :

public boolean addAll(Collection<? extends T> c)

но это не удается с:

public boolean retainAll(Collection<?> c) так как здесь я не могу изменить тип коллекции :/

public boolean retainAll(Collection<?> c){
    boolean result = false;
    for(T t : c){
    }
    return result;
}

person mastodon    schedule 08.11.2010    source источник
comment
Как вы реализуете retainAll(Coll...)?   -  person Adeel Ansari    schedule 08.11.2010


Ответы (3)


Это правильный подход?

Да, это правильный подход. Это то, как определяется интерфейс (за исключением того, что интерфейс использует E, но это не имеет значения).

Обратите внимание, что ваш addAll должен возвращать boolean. Кроме того, вам не нужно приводить addAll, который вы реализовали. Вместо этого измените свой цикл:

   for(T o : c){...}

И ваш retainAll тоже должен быть в порядке, пока вы возвращаете boolean.

РЕДАКТИРОВАТЬ:

Для вашей реализации retainAll не должно быть необходимости перебирать переданное в Collection<?> и приводить к T. Рассмотрите возможность повторения вашего резервного массива tab и посмотрите, содержится ли каждый экземпляр в переданном в Collection<?> c. Если по какой-то причине вам абсолютно необходимо использовать предметы в пределах c как T, вы можете разыграть.

person akf    schedule 08.11.2010
comment
в keepAll я получаю «несовместимые типы». Требуется T, найден java.lang.Object' - person mastodon; 08.11.2010

Вы должны определить свой метод addAll следующим образом:

public boolean addAll(Collection<? extends T> c) {...}

Вот как это определено в Java API

person John Engelman    schedule 08.11.2010
comment
И если у вас возникли проблемы с сохранениемВсе, вы должны переопределить сохранить все, чтобы взять в коллекцию‹? также расширяет T›. Другие предложения работают, но этот, на мой взгляд, более правильный. - person Justin Standard; 08.11.2010

Приведение к T не требуется для реализации retainAll(...). Например:

public boolean retainAll(Collection<?> c){
    boolean result = false;
    Iterator<T> it = this.iterator();
    while (it.hasNext()) {
        T t : it.next();
        if (!c.contains(t)) {
            it.remove();
            result = true;
        }
    }
    return result;
}
person Stephen C    schedule 08.11.2010