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 Objectn'est pas réellement redondant. Par exemple, <T extends Object & Foo>fera Tdevenir Objectsous effacement, alors qu'avec <T extends Foo>elle deviendra Foosous 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.Collectionsclasse du JDK a une méthode avec cette signature:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Objectfait 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 Objectclasse.
<? extends Object>
<? extends Object>signifie que vous pouvez passer un objet ou une sous-classe qui étend la Objectclasse.
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:
Objectclasse.