@Dan Если вы введете в этот вопрос поисковый запрос "? Extends Object", вы ничего не найдете. Я читаю ответы, чтобы узнать, могу ли я что-нибудь сделать, но я не думаю, что это все. В частности, речь не идет о дженериках.
orbfish 08
@Dan - Это другой вопрос. Я видел этот вопрос раньше и помню, по крайней мере, упоминание о тонкой разнице. Дай мне посмотреть, смогу ли я его найти ..
<?>и <? extends Object>являются синонимами, как и следовало ожидать.
Есть несколько случаев с дженериками, которые на extends Objectсамом деле не являются избыточными. Например, <T extends Object & Foo>приведет к тому , Tчтобы стать Objectпод стиранием, в то время как с <T extends Foo>он станет Fooпод стиранием. (Это может иметь значение, если вы пытаетесь сохранить совместимость с используемым ранее созданным API Object.)
Я не понимаю, как связан этот пример? (поскольку он не использует ни <?>, ни <? extends Object>)
orbfish
27
@orbfish: Это относится только в том , что я думал , что вы нашли это интересным, так как это пример , где на extends Objectсамом деле является значимым. Если я ошибся, то прошу прощения. Надеюсь, это заинтересует, по крайней мере, других людей, столкнувшихся с вашим вопросом.
ruakh 08
@ruakh - Меня интересовали ограниченные символы подстановки, а не параметры типа, но, по крайней мере, вы ответили.
orbfish
1
Тогда вы должны были заявить об этом в своем исходном посте. Таким образом, его ответ мог бы быть более актуальным для вас.
liltitus27 07
19
Хотя <?>предполагается, что это ярлык <? 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 от Мориса Нафталина.
Как может List <?> Быть реифицируемым, если компилятор переведет его в List <Object>, чтобы получить информацию о типе? потерян?
Трисмегиста
Я считаю, что <?> Больше предназначен для обратной совместимости с устаревшими API. различать с помощью <Object> и <? расширяет Object>, который является кодом Java 5.
Dennis C
9
<?>это сокращение от <? 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», но все классы Java наследуются или неявно наследуются от Objectкласса.
Ответы:
<?>
и<? extends Object>
являются синонимами, как и следовало ожидать.Есть несколько случаев с дженериками, которые на
extends Object
самом деле не являются избыточными. Например,<T extends Object & Foo>
приведет к тому ,T
чтобы статьObject
под стиранием, в то время как с<T extends Foo>
он станетFoo
под стиранием. (Это может иметь значение, если вы пытаетесь сохранить совместимость с используемым ранее созданным APIObject
.)Источник: 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>
означает, что вы можете передать объект или подкласс, расширяющий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
класса.