Я считаю, что тип ?
в 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