Все классы без исключения наследуются от
Object. Поэтому
неограниченный wildcard
<?> всегда подразумевает его в качестве верхней границы. Оба этих типа в рантайме
сотрутся в
List<Object>, функциональных отличий нет.
Не смотря на одинаковое поведение, существует одно синтаксическое различие. Неограниченный дженерик – reifiable тип. Это значит, что он представлен в рантайме. Такой тип можно использовать в операторе
instanceof, тогда как синтаксическая конструкция
x instanceof List<? extends Object> приведет к ошибке компиляции.
Тип List без параметра имеет больше отличий, мы уже говорили о них ранее, в публикациях про
raw types и проблему
heap pollution.