В чем разница между и
Я видел подстановочный знак, используемый раньше для обозначения любого объекта , но недавно увидел использование:
<? extends Object>
поскольку все объекты расширяют объект, являются ли эти два использования синонимами?
3 ответа:
<?>
и<? extends Object>
являются синонимами, как и следовало ожидать.есть несколько случаев с дженерики где
extends Object
на самом деле не является избыточным. Например,<T extends Object & Foo>
вызываетT
статьObject
при стирании, тогда как с<T extends Foo>
станетFoo
под стирание. (Это может иметь значение, если вы пытаетесь сохранить совместимость с API pre-generics, который использовал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>
есть небольшая разница между двумя.<?>
является reifiable в то время как<? 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 generics и коллекции Морис Нафталин
<?>
это сокращение от<? extends Object>
. Вы можете прочитать ниже ссылку для более подробной информации.
<?>
"?"
обозначает любой неизвестный тип,он может представлять любой тип в коде для. Используйте этот подстановочный знак, если вы не уверены в типе.ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number unknownList = new ArrayList<Float>(); //Float is of type Number
Примечание:
<?>
означает, что угодно. Поэтому он может принимать типы, которые не наследуются от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-используется для обозначения типа
Е – используется для обозначения элемента
К – ключи
V - значения
Н – для чисел
Ref: