При работе с дженериками я столкнулся с объявлением < ? extends E>
. Если я возьму пример метода addAll интерфейса коллекции.Что такое использование <? extends E>
Его заявление, как:
interface Collection<E> {
public boolean addAll(Collection<? extends E> c);
}
так из приведенного выше заявления о addAll, что я понял (как читать из различных источников), что
? extends E
означает, что он также хорошо, чтобы добавить все элементы коллекции с элементами любого типа, которые являются подтипом E
Пошлите этот пример:
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);
List<? extends Number> nums = ints; // now this line works
/*
*without using ? syntax above line did not use to compile earlier
*/
List<Double> doubleList = new ArrayList<Double>();
doubleList.add(1.0);
nums.addall(doubleList); // compile time error
Ошибка:
The method addall(List< Double >) is undefined for the type List< capture#1-of ? extends Number >
Я также читал в О'Рейли «Java дженериков и Коллекции»
In general, if a structure contains elements with a type of the form ? extends E, we can get elements out of the structure, but we cannot put elements into the structure.
Так что мой вопрос, когда мы не можем изменить вещь с этим , то в чем польза? Просто чтобы получить элементы из этой коллекции, если это подтип?
Вы пытались выполнить поиск? Об этом, должно быть, говорили раньше. – Henry
Да, я сделал. Но ни один вопрос не охватывает то, что я спросил, я знаю, использование этой дикой карты, но мой вопрос, почему он используется, когда мы не можем добавить/изменить существующую коллекцию. – hellrocker
Ошибка компиляции –