Какой параметр типа определяет компилятор при использовании алмаза? - PullRequest
1 голос
/ 18 июня 2019

Я хочу знать, какой будет параметр типа, который компилятор определяет при создании List, а его параметризованный тип ограничен предложениями extends или super.

List<? extends Number> numbersList = new ArrayList<>(); List<? super Integer> integersList = new ArrayList<>();

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Это подробно обсуждается в §18 JLS .

. В вашем случае List<? extends Number> будет заменено на List<Number>, поскольку Number - верхняя граница,тогда как List<? super Number> будет заменено на List<Object>, поскольку Object является верхней границей.Вы можете проверить это с помощью быстрого теста, я кодировал его на Ideone

Для обсуждения, почему это полезно, вы можете взглянуть на мнемоника PECS

0 голосов
/ 18 июня 2019

Выводит, какой бы тип с левой стороны не был.

List тоже эквивалентно List<Object>, поэтому выводит ArrayList<Object>.

Map<String, OutputStream> map = new HashMap<>(); будет означать <String, OutputStream>

РЕДАКТИРОВАТЬ: Вы обновили свой вопрос, но он все еще остается в силе, левая сторона будет равна правой стороне, так как он должен для того, чтобыустановить их равными

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...