Я реализую интерфейс 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;
}
Ответ 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;
}