Раніше я бачив узагальнюючий знак, який означав будь-який об’єкт, але нещодавно бачив використання:
<? 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класу.