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