Я считаю, что тип ?
в generics - это определенного неизвестного типа. Это означает, что объявление, например, списка этого типа, помешает нам добавить в него какой-либо объект.Неравномерности с (?) Подстановочным знаком общего типа
List<?> unknownList;
unknownList.add(new Object()); // This is an error.
Компилятор выдает сообщение об ошибке, как ожидалось.
Но когда неизвестный тип является генератором второго уровня, компилятор, похоже, не заботится.
class First<T> {}
List<First<?>> firstUnknownList;
// All these three work fine for some reason.
firstUnknownList.add(new First<>());
firstUnknownList.add(new First<Integer>());
firstUnknownList.add(new First<String>());
Я думал, что, вероятно, компилятор не заботится о родовом параметре второго уровня на всех, но это не тот случай,
List<First<Integer>> firstIntegerList;
firstIntegerList.add(new First<String>()); // This gives a compiler error as expected.
Итак, почему компилятор позволяет добавлять любой элемента, когда во втором примере допустим только неизвестный элемент (и, следовательно, ничего)?
Примечание: Компилятор Java 1.8
Добавив «новый первый()' в список «>», что вы можете сделать, это небезопасно? Представьте, что у вас есть производитель '' и метод '' потребителя '' на 'First ': вы не можете вызвать пользователя; и вы можете получить «объект» от производителя. Таким образом, в этом нет ничего небезопасного - если у меня не будет очевидного случая. –
"и, следовательно, ничего" кроме "null". –
«Список >» может быть присвоен «List», а затем добавление объекта * * неверно. 'Список