Какая разница между <?> и <? extends Object>?

282
26 сентября 2017, 05:34

Как я понял, вместо подставить можно любой тип (кроме примитивов), зачем тогда есть ?

Answer 1

<?> и <? extends Object> являются синонимами, как и ожидается, но есть несколько случаев с дженериками, где extends Object фактически не является избыточным. Например, <T extends Object & Foo> приведет к тому, что T станет объектом при стирании, тогда как с <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)

Сссылка на источник SO: What's the difference between <?> and <? extends Object> in Java Generics?

Answer 2

По сути, разницы нет. Но по дефолту любой класс наследуется от Object и ? extends Object можно не писать.

Answer 3
<? extends T>
  • позволяет сделать дженериком любой класс дочерний от класса T, при этом запрещает классы родителей

ArrayList<? extends Number> ... и тд. можем в реализации записать как <Integer>, но не сможем как <Object>

<? super T> 
  • позволяет сделать дженериком любой класс являющийся родителем классу T вплоть до Object, запрещая классы потомков

ArrayList<? super Number> ... и тд. можем в реализации записать как <Object>, но не сможем как <Integer>

Вся красота полиморфизма.

READ ALSO
Шифровка строк. Чат

Шифровка строк. Чат

Есть чатподскажите пожалуйста как можно шифровать сообщения в базе? но зашифровать так что бы можно было расшифровать

266
Хранение токена [дубликат]

Хранение токена [дубликат]

На данный вопрос уже ответили:

261
jsoup и html в java

jsoup и html в java

Есть такой код:

244