В чем разница между и


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

<? extends Object>

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

3 78

3 ответа:

<?> и <? extends Object> являются синонимами, как и следовало ожидать.

есть несколько случаев с дженерики где extends Object на самом деле не является избыточным. Например, <T extends Object & Foo> вызывает T стать Object при стирании, тогда как с <T extends Foo> станет Foo под стирание. (Это может иметь значение, если вы пытаетесь сохранить совместимость с API pre-generics, который использовал 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
)

хотя <?> должен быть ярлык для <? extend object> есть небольшая разница между двумя. <?> является reifiable в то время как <? 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 generics и коллекции Морис Нафталин

<?> это сокращение от <? 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-используется для обозначения типа
Е – используется для обозначения элемента
К – ключи
V - значения
Н – для чисел
Ref:

enter image description here