В чем разница между <?> И <? расширяет объект> в Java Generics?
Я видел подстановочный знак, использовавшийся ранее для обозначения любого объекта - но недавно увидел использование:
<? extends Object>
Поскольку все объекты расширяют объект, являются ли эти два использования синонимами?
3 ответа
<?>
а также <? 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>
не является. Причина, по которой они это сделали, состоит в том, чтобы было легче различать типы 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 от Мориса Нафталина
<?>
это сокращение для <? 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 - используется для обозначения типа
E - используется для обозначения элемента
K - ключи
V - значения
N - для чисел
Ref: