2016-06-26 5 views
0

При работе с дженериками я столкнулся с объявлением < ? 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.

Так что мой вопрос, когда мы не можем изменить вещь с этим , то в чем польза? Просто чтобы получить элементы из этой коллекции, если это подтип?

+0

Вы пытались выполнить поиск? Об этом, должно быть, говорили раньше. – Henry

+0

Да, я сделал. Но ни один вопрос не охватывает то, что я спросил, я знаю, использование этой дикой карты, но мой вопрос, почему он используется, когда мы не можем добавить/изменить существующую коллекцию. – hellrocker

+0

Ошибка компиляции –

ответ

0

Это означает, что метод addAll позволяет любую коллекцию объектов, которая расширяет класс E. Например, если G расширяет E, вы можете добавить массив G в эту коллекцию.

+0

Я не думаю, что это так. Вы не можете добавить массив gg этой коллекции. Технически, объявив , вы делаете коллекцию неизменной. Правильно ли я @ marko-topolnik –

+0

Единственное, что я мог ясно видеть, это использование метода Sort из класса коллекций. Коллекции реализуют статические классы. Сортировка - один из них с синтаксисом: public static > void sort (Список ). Если мы не реализуем Comparable, то мы не можем использовать SORT здесь. –

2

So my question is when we can't modify the thing with this , then what is the use ? Just to get the elements from that collection if it is a subtype ?

Да, это правильно. Просто чтобы получить от него элементы.

Имейте в виду, что Collection<? extends Number> - это тип переменной , а не тип самой коллекции. Значение синтаксиса подстановочных знаков более похоже на шаблон, который должна соответствовать определенной коллекции, чем тип в смысле «объект X имеет тип T».

Если у Java не было подстановочных знаков, вы были бы очень ограничены тем, что вы можете выразить. Например, общий метод addAll будет принимать только набор одного и того же типа компонента.

Смежные вопросы