Список списка номеров с ограниченным типом подстановки - PullRequest
5 голосов
/ 29 мая 2019

Если у меня есть это,

Collection<? extends Number> c = new ArrayList<>();
c.add(new Integer(1)); // Compile time error

Поскольку мы не знаем, что означает тип элемента c, мы не можем добавить к нему целые числа.

Но если мне нравится,

List<List<? extends Number>> history = new ArrayList<>();

List<Integer> integers = new ArrayList<>();
integers.add(new Integer(1));

List<Double> doubles = new ArrayList<>();
doubles.add(new Double(2));

history.add(integers); // This is allowed
history.add(doubles);  // This is allowed

Почему допускается добавление во 2-м примере?

1 Ответ

9 голосов
/ 29 мая 2019
Collection<? extends ...>
c.add(...);

Нельзя добавить коллекцию с нижней границей.

List<List<...>> history;
history.add(...);      // Allowed

Внешний список имеет конкретный тип. Подстановочный знак ? extends находится внутри внутреннего списка, но он не имеет значения, поскольку вы добавляете во внешний список. Я заменил подстановочный знак на ..., поскольку не имеет значения, что это, когда вы звоните history.add().

Если внешний список имеет подстановочный знак, добавление завершится неудачей.

List<? extends List<...>> history;
history.add(...);      // NOT allowed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...