#java #generics
#java #общие
Вопрос:
У меня есть несколько (нелогичных) замечаний по поводу общих обозначений подстановочных знаков, используемых в коллекциях. Цель обозначения подстановочных знаков List<? extends T>
состоит в том, чтобы разрешить присвоение списка (подтипов T) ссылке на список ‘? of T’. Его цель не в том, чтобы специально разрешать добавление элементов подтипов T в список (из ‘? из T’ ), что возможно даже в List<T>
.
List<Number> list = new ArrayList<Integer>(); // invalid , List<Integer> is not assignable to List<Number>
List<Number> list = new ArrayList<Number>() ; // OK
list.add(new Integer(1)); // valid , '? extends Number' not needed!
List<? extends Number> list1 = new ArrayList<Integer>(); // Valid , because of notation '? extends Number'
Верно ли мое наблюдение?
Комментарии:
1. @Kaj, да, и я указал ошибки компиляции в соответствующих строках
Ответ №1:
Да, ваше наблюдение верно. Однако, в случае, который вы показываете, это не очень полезно (вы предпочитаете игнорировать полезную информацию о списке). Назначение более полезно, когда оно неявно при вызове библиотечной функции.
Например, предположим, у вас была библиотечная функция, которая закрывала коллекцию входных потоков. Вы могли бы принять List<InputStream>
, но это излишне ограничительно. Вы могли бы вместо этого сделать это:
public void closeAll(Collection<? extends InputStream> streams) {
for ( InputStream stream : streams ) {
stream.close();
}
}
Теперь вместо этого вы можете передать List<FileInputStream>
.
Комментарии:
1. Можно было бы даже сделать это
Collection<? extends Closeable>
, заставив его работать и дляOutputStream
s и т.д. Также.
Ответ №2:
Extends предназначен для чтения из списка, а Super — для записи в список. Прочитайте страницу 7 этого руководства: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
Прочитайте эти конспекты лекций из курса MIT по конструированию программного обеспечения: http://stellar.mit.edu/S/course/6/sp11/6.005/courseMaterial/topics/topic2/lectureNotes/Generics-spring11/Generics-spring11.pdf
надеюсь, это прояснит все с помощью подстановочных знаков и обобщений.