Я видел подстановочный знак, используемый раньше, чтобы обозначать любой объект, но в последнее время видел использование:
<? extends Object>
Поскольку все объекты расширяют Object, являются ли эти два синонимами?
Я видел подстановочный знак, используемый раньше, чтобы обозначать любой объект, но в последнее время видел использование:
<? extends Object>
Поскольку все объекты расширяют Object, являются ли эти два синонимами?
<?>
и <? extends Object>
являются синонимами, как и следовало ожидать, но есть несколько случаев с дженериками, где extends Object
на самом деле не избыточно. Например, <T extends Object & Foo>
приведет к тому, что T
станет Object
под стиранием, тогда как с <T extends Foo>
он станет Foo
при стирании. (Это может иметь значение, если вы пытаетесь сохранить совместимость с API-интерфейсом до генерации, который использовал Object
.)
(Источник: http://download.oracle.com/javase/tutorial/extra/generics/convert.html, это объясняет, почему класс JDK java.util.Collections
имеет метод с этой сигнатурой:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
.)
Хотя <?>
должен быть ярлыком для <? extend object>
, между ними существует небольшая разница.
<?>
можно повторно использовать, а <? extend object>
- нет. Причина, по которой они сделали это, - это упростить распознавание повторяющегося типа. Все, что выглядит как <? 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-дженерики и коллекции от Maurice Naftalin
<?>
является сокращением для <? extends Object>
.
Вы можете прочитать ниже общую ссылку для более подробной информации.
<?>
"?"
обозначает любой неизвестный тип, он может представлять любой тип в коде для. Используйте этот шаблон, если вы не уверены в типе.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Примечание. <?>
означает anythings. Таким образом, он может принимать тип, который не унаследован от класса Object
.
<? extends Object>
<? extends Object>
означает, что вы можете передать объект или подкласс, который расширяет класс Object
.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - используется для обозначения типа
E - используется для обозначения элемента
K - ключи
V - значения
N - для чисел
Ссылка: