Параметризация LinkedList с помощью «?» в Яве

1

Я новичок в некоторых встроенных структурах данных в JAVA и наблюдал во время игры с LinkedList, что этот код не вызывает ошибку:

LinkedList<?> list = new LinkedList<Integer>();

Может ли кто-нибудь объяснить мне, как мы можем это сделать как действительное выражение? Я использую Eclipse, и при инициализации он не показывает никаких ошибок. Однако добавление элементов после этого не работает в этом случае.

  • 1
    Как вы думаете, почему он должен быть недействительным?
  • 0
    так интересно. даже если вы сделаете вывод, это работает. Вы должны добавить это как LinkedList <?> list = new LinkedList <> ();
Показать ещё 13 комментариев
Теги:
linked-list

2 ответа

4
Лучший ответ

В

LinkedList<?> list;

вы объявляете переменную с именем list type LinkedList и предоставляете подстановочный знак ? как аргумент типа, связанный с параметром типа LinkedList T Таким образом, list будет иметь тип LinkedList<?>. Этот шаблон ? будет захватывать некоторый тип, но этот тип будет неизвестным и непригодным для использования.

Эта

new LinkedList<Integer>();

является выражением создания экземпляра. Вы создаете экземпляр типа LinkedList, предоставляя аргумент типа типа Integer для привязки к типу типа LinkedList T Таким образом, тип выражения создания экземпляра будет LinkedList<Integer>.

Обратите внимание, что вы будете взаимодействовать с созданным LinkedList через list переменных типа LinkedList<?>. Поэтому, независимо от того, какой аргумент типа вы использовали для его создания, вы теперь смотрите на него с помощью значения типа LinkedList<?>.

Теперь вы можете присвоить значение типа LinkedList<Integer> переменной типа LinkedList<?> Потому что LinkedList<?> - это супер тип LinkedList<Integer>. Мы можем подробно рассказать о том, почему это так, но правила описаны здесь.


Что касается

LinkedList<?> list = new LinkedList<>();

обозначение <> означает, что аргумент типа для выражения создания экземпляра должен быть выведен. Правила вывода типов многочисленны и сложны. В принципе, с тех пор ? обозначает неизвестный тип, единственное, что мы можем быть уверены в том, что аргумент типа должен быть по крайней мере Object поскольку это супертип всех типов. И поэтому это становится выведенным типом.

1

? поскольку общий параметр в основном означает "любой класс", и Integer определенно квалифицируется как "любой класс", следовательно, нет ошибки. Во время инициализации ошибок нет, потому что во время выполнения генераторы не присутствуют, поэтому какой тип общего вам не имеет значения после компиляции кода (почти не имеет значения)

  • 0
    как ты это объяснишь? LinkedList <?> List1 = new LinkedList <> ();
  • 0
    какой тип здесь?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню