Как я понял, вместо подставить можно любой тип (кроме примитивов), зачем тогда есть ?
<?> и <? extends Object> являются синонимами, как и ожидается, но есть несколько случаев с дженериками, где extends Object фактически не является избыточным. Например, <T extends Object & Foo> приведет к тому, что T станет объектом при стирании, тогда как с <T extends Foo> он станет Foo при стирании. (Это может иметь значение, если вы пытаетесь сохранить совместимость с API-интерфейсом предварительного генерации, который использовал Object).
(Здесь: http://download.oracle.com/javase/tutorial/extra/generics/convert.html; объясняется, почему класс java.util.Collections JDK имеет метод с этой сигнатурой:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
Сссылка на источник SO: What's the difference between <?> and <? extends Object> in Java Generics?
По сути, разницы нет. Но по дефолту любой класс наследуется от Object и ? extends Object можно не писать.
<? extends T>
ArrayList<? extends Number> ... и тд. можем в реализации записать как <Integer>, но не сможем как <Object>
<? super T>
ArrayList<? super Number> ... и тд. можем в реализации записать как <Object>, но не сможем как <Integer>
Вся красота полиморфизма.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости