Я видел подстановочный знак, который раньше использовался для обозначения любого объекта, но недавно видел использование:
<? 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 ; он объясняет, почему у java.util.Collections
класса JDK есть метод с этой подписью:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
самом деле является значимым. Если я ошибся, то прошу прощения. Надеюсь, это заинтересует, по крайней мере, других людей, столкнувшихся с вашим вопросом.
Хотя <?>
предполагается, что это ярлык <? extend object>
, между ними есть небольшая разница.
<?>
реифицируем, а <? extend object>
нет. Причина, по которой они сделали это, состоит в том, чтобы облегчить различение реифицируемого типа. Все , что выглядит как <? extends something>
, <T>
, <Integer>
являются nonreifiable.
Например, этот код будет работать
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:
Object
класса.