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?
<?>
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 T
Object
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
)
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
<?>
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
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: