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 NumberRemarque: <?> 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.