Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: mastodonОтветов: 3

Я реализую интерфейс 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;
}
  • Как вы реализуете retainAll(Coll...)? Adeel Ansari 08.11.2010

javagenericscastingcontent-type

Ответы

Ответ 1 · рейтинг 1 · akf

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

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

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

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

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

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

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

Ответ 2 · рейтинг 1 · John Engelman

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

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

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

Ответ 3 · рейтинг 1 · Stephen C

Приведение к 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;
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы