Я не могу объяснить, почему компилятор не будет рассматривать их как эквивалентные, но, учитывая, что это не так, я попытаюсь объяснить, почему он отказывается это делать.
Первый (List<? extends Object>
) утверждает, что тип объектов, содержащихся в List
, имеет некоторый неизвестный тип, полученный из Object
. Второй (List<?>
) говорит меньше; это просто говорит о том, что тип объектов в списке неизвестен. В качестве верхней границы неизвестного типа не упоминается ни один ожидаемый супертип.
Чтобы проверить первое предположение, компилятор хочет услышать, как вы что-то говорите об ожидаемых типах, хранящихся в экземпляре List
, сконструированном здесь как необработанный тип LinkedList
, который ничего не говорит по этому вопросу. Однако, если вы должны построить экземпляр как тип LinkedList<Object>
, вы по крайней мере гарантируете, что ковариант , считывающий против экземпляра, будет соответствовать вашему утверждению, а именно: некоторые вещи в этом списке вид Object
.
Теперь, это все кажется глупым, потому что каждый ссылочный / не примитивный тип в Java расширяется Object
, поэтому не должно быть никакой разницы в интерпретации между List<? extends Object>
и List<?>
; в конце концов, второй подразумевает первый в силу обязательной иерархии классов в системе типов языка.