J'ai quelques questions sur les caractères génériques génériques en Java:
Quelle est la différence entre
List<? extends T>
etList<? super T>
?Qu'est-ce qu'un joker borné et qu'est-ce qu'un joker illimité?
java
generics
bounded-wildcard
Pablo Fernandez
la source
la source
Réponses:
Dans votre première question,
<? extends T>
et<? super T>
sont des exemples de caractères génériques délimités. Un joker illimité ressemble<?>
, et signifie essentiellement<? extends Object>
. Cela signifie vaguement que le générique peut être de n'importe quel type. Un caractère générique borné (<? extends T>
ou<? super T>
) place une restriction sur le type en disant qu'il doit soit étendre un type spécifique (<? extends T>
est connu comme une limite supérieure), soit doit être un ancêtre d'un type spécifique (<? super T>
est connu comme une limite inférieure) .Les didacticiels Java ont de très bonnes explications sur les génériques dans les articles Wildcards et More Fun with Wildcards .
la source
<? super C>
signifierait que votre type est limité à quelque chose ci-dessusC
dans la hiérarchie des types. (Désolé pour la réponse extrêmement tardive. Je suppose que nous n'avons pas eu de notifications de commentaires il y a 2 ans?)Si vous avez une hiérarchie de classes A, B est une sous-classe de A, et C et D sont tous deux une sous-classe de B comme ci-dessous
ensuite
Un caractère générique borné est comme
? extends B
si B est un type. Autrement dit, le type est inconnu mais une "borne" peut être placée dessus. Dans ce cas, il est délimité par une classe, qui est une sous-classe de B.la source
List<? super B>
décrit comme List accepte le type qui est la classe parente de la classe B ? C'est pourquoi C et D ne compilent pas hmm?Josh Bloch a également une bonne explication sur le moment de l'utiliser
super
etextends
dans cette conférence vidéo google io où il mentionne le mnémonique Producerextends
Consumersuper
.À partir des diapositives de la présentation:
la source
Il peut arriver que vous souhaitiez restreindre les types de types autorisés à être transmis à un paramètre de type. Par exemple, une méthode qui opère sur des nombres peut vouloir uniquement accepter des instances de Number ou de ses sous-classes. C'est à cela que servent les paramètres de type borné.
signifie qu'il peut accepter tous les objets qui ont une relation IS- A avec MyObject (c'est-à-dire tout objet qui est un type de myObject ou nous pouvons dire tout objet de n'importe quelle sous-classe de MyObject) ou un objet de la classe MyObject.
Par exemple:
Ensuite,
n'acceptera que MyObject ou les enfants de MyObject (c'est-à-dire tout objet de type OurObject ou YourObject ou MyObject, mais pas tout objet de superclasse de MyObject).
la source
En général,
Pour mettre des éléments dans la structure, nous avons besoin d'un autre type de caractère générique appelé
Wildcards with super
,la source
Des caractères génériques génériques sont créés pour rendre les méthodes qui fonctionnent sur Collection plus réutilisables.
Par exemple, si une méthode a un paramètre
List<A>
, nous ne pouvons donnerList<A>
qu'à cette méthode. C'est un gaspillage pour la fonction de cette méthode dans certaines circonstances :List<A>
, alors nous devrions être autorisés à donnerList<A-sub>
à cette méthode. (Parce que A-sub EST un A)List<A>
, alors nous devrions être autorisés à donnerList<A-super>
à cette méthode. (Parce que A EST un A-super)la source