Хотя <?>
считается сокращением для <? extend object>
, между ними есть небольшая разница.<?>
подлежит перечислению, а <? extend object>
- нет.Причина, по которой они это сделали, состоит в том, чтобы было легче различать типы reifiable.Все, что выглядит как <? extends something>
, <T>
, <Integer>
, нельзя переопределить.
Например, этот код будет работать
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
, но при этом выдается ошибка
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
для получения дополнительной информации читайте дженерики и коллекции Java от Мориса Нафталина