Приведение объектов к типу <T> - PullRequest
4 голосов
/ 08 ноября 2010

Я реализую интерфейс List для класса, который хранит данные в массиве типа <T>. Это вызывает проблемы с методами, которые принимают Collection в качестве параметров, так как collection сохраняет свои объекты как 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;
}

Ответы [ 3 ]

1 голос
/ 08 ноября 2010

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

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

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

1 голос
/ 08 ноября 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;
}
1 голос
/ 08 ноября 2010

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

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

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

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

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

EDIT:

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

...