В чем разница между и
Я видел подстановочный знак, используемый раньше для обозначения любого объекта , но недавно увидел использование:
<? 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:

