В чем разница междуа такжев Дженерике Java? - PullRequest
83 голосов
/ 08 ноября 2011

Я видел подстановочный знак, использовавшийся ранее для обозначения любого объекта - но недавно увидел использование:

<? extends Object>

Поскольку все объекты расширяют объект, являются ли эти два использования синонимами?

Ответы [ 3 ]

92 голосов
/ 08 ноября 2011

<?> и <? 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
)
19 голосов
/ 06 января 2016

Хотя <?> считается сокращением для <? 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 от Мориса Нафталина

7 голосов
/ 05 июля 2017

<?> является сокращением для <? 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 

enter image description here

T - используется для обозначения типа
E - используется для обозначения элемента
K - клавиши
V - значения
N - для чисел
Ссылка:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...