web-dev-qa-db-fra.com

Quelle est la différence entre <?> Et <? étend Object> in Java Generics?

J'ai vu le caractère générique utilisé auparavant pour désigner n'importe quel objet - mais j'ai récemment vu une utilisation de:

<? extends Object>

Puisque tous les objets étendent Object, ces deux usages sont-ils synonymes?

85
orbfish

<?> et <? extends Object> sont également synonymes, comme vous vous en doutez.

Il y a quelques cas avec des génériques où extends Object n'est pas réellement redondant. Par exemple, <T extends Object & Foo> entraînera la suppression de TObject sous effacement, alors qu'avec <T extends Foo> il deviendra Foo sous effacement. (Cela peut être important si vous essayez de conserver la compatibilité avec une API pré-générique qui utilisait Object.)

Source: http://download.Oracle.com/javase/tutorial/extra/generics/convert.html ; il explique pourquoi le JDK's Java.util.Collections la classe a une méthode avec cette signature:

public static <T extends Object & Comparable<? super T>> T max(
    Collection<? extends T> coll
)
95
ruakh

Bien que <?> est censé être un raccourci pour <? extend object>, il y a une petite différence entre les deux. <?> est réifiable tandis que <? extend object> n'est pas. La raison pour laquelle ils l'ont fait est de faciliter la distinction entre les types réifiables. Tout ce qui ressemble à <? extends something>, <T>, <Integer> ne sont pas vérifiables.

Par exemple, ce code fonctionnerait

List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;

mais cela donne une erreur

List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;

pour plus d'informations, lisez Java génériques et collections par Maurice Naftalin

19
Renzhentaxi Baerde

<?> est un raccourci pour <? extends Object>. Vous pouvez lire le lien partagé ci-dessous pour plus de détails.


<?>

"?" désigne tout type inconnu, il peut représenter n'importe quel type dans le code pour. Utilisez ce caractère générique si vous n'êtes pas sûr du type.

ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number

Remarque: <?> signifie n'importe quoi. Il peut donc accepter des types qui ne sont pas hérités de la classe Object.

<? extends Object>

<? extends Object> signifie que vous pouvez passer un objet ou une sous-classe qui étend la classe 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 - utilisé pour désigner le type
E - utilisé pour désigner l'élément
Touches K
V - valeurs
N - pour les nombres
Réf:

enter image description here

8
roottraveller