J'ai déjà vu le joker utilisé 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?
J'ai déjà vu le joker utilisé 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?
Réponses:
<?>
et <? extends Object>
sont également, comme vous vous en doutez.
Il y a quelques cas avec des génériques où ce extends Object
n'est pas réellement redondant. Par exemple, <T extends Object & Foo>
fera T
devenir Object
sous effacement, alors qu'avec <T extends Foo>
elle deviendra Foo
sous effacement. (Cela peut être important si vous essayez de conserver la compatibilité avec une API pré-générique utilisée Object
.)
Source: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; il explique pourquoi la java.util.Collections
classe du JDK a une méthode avec cette signature:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
fait est significatif. Si je me suis trompé, je m'excuse. J'espère que cela intéressera au moins d'autres personnes qui rencontreront votre question.
Bien que ce <?>
soit censé être un raccourci pour <? extend object>
, il existe une petite différence entre les deux.
<?>
est réifiable alors que <? extend object>
ne l'est pas. La raison pour laquelle ils l'ont fait est de faciliter la distinction du type réifiable. Tout ce qui ressemble <? extends something>
, <T>
, <Integer>
sont nonreifiable.
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 les génériques Java et les collections de 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 Object
classe.
<? extends Object>
<? extends Object>
signifie que vous pouvez passer un objet ou une sous-classe qui étend la Object
classe.
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
K - clés
V - valeurs
N - pour les nombres
Réf:
Object
classe.