Основное намерение или цель обозначения подстановочных знаков’? расширяет T’

#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

надеюсь, это прояснит все с помощью подстановочных знаков и обобщений.