De ce tutoriel Oracle ,
Bien que
Integer
soit un sous-type deNumber
,List
n’est pas un sous-type deList
et, en fait, ces deux types ne sont pas liés.Le parent commun de
List
etList
estList
.
Ma question concerne la deuxième phrase. Comment pouvons-nous dire que List
Est le parent commun de List
et List
?
?
représente un type inconnu, qui pourrait être n’importe quel type de référence. Même si je dis ça ?
serait Object
ici, Object
étant le parent commun de Integer
et Number
ne signifie pas que List
devient un parent commun de List
et List
.
Le contexte que vous devez comprendre n’est pas un Integer
ou un Number
mais la List
. Supposons que vous créiez la classe List
, puis comment créeriez-vous la classe pour qu’elle prenne en charge uniquement un type de classe spécifique.
Oui, cette classe List
n’utilisera pas Object comme type mais utilisera plutôt un caractère générique ?
.
Comme le dit la documentation de WildCards
Alors, quel est le supertype de toutes sortes de collections? C’est écrit
Collection>
(Prononcé “collection of unknown”)
La même chose peut être dite pour la liste.
Alors, quel est le supertype de toutes sortes de listes? C’est écrit
List>
(Prononcé “List of unknown”)
Nous pouvons prouver que List>
Est un sur-type de List
et List
.
De JLS 4.10.2 (emphase mien):
Etant donné une déclaration de type générique C
(n> 0), les supertypes directs du type paramétré C
, où Ti (1 ≤ i ≤ n) est un type, sont toutes les suivantes:
…
C
, oùSi
contientTi
(1 ≤ i ≤ n) (§4.5.1)
en remplaçant C
par List
et n=1
, nous soaps que List>
est un supertype direct de List
et List
si ?
contient Number
et Integer
.
Nous pouvons le prouver ?
contient Number
et Integer
car de JLS 4.5.1 :
Le joker
? extends Object
? extends Object
est équivalent au caractère générique sans limites?
.
et plus loin:
On dit qu’un argument de type
T1
contient un autre argument de typeT2
, écritT2
<=T1
, si l’ensemble des types notésT2
est un sous-ensemble de l’ensemble de types notéT1
sous la fermeture réflexive et transitive des règles suivantes ( où <: indique le sous-typage (§4.10)):
? extends T
? extends T
<=? extends S
? extends S
si T <: S- …
T
<=? extends T
? extends T
nous pouvons utiliser les règles ci-dessus pour prouver que Number
<= ?
, parce que Number
<= ? extends Number
? extends Number
<= ? extends Object
? extends Object
= ?
.
Le tutoriel concerne les caractères génériques. Ils veulent donc expliquer quand et comment les utiliser. Lorsque vous lisez à l’avance, il y a l’exemple de code:
List extends Integer> intList = new ArrayList<>(); List extends Number> numList = intList; // OK. List extends Integer> is a subtype of List extends Number>
Vous pouvez seulement faire cette mission si ?
est le parent commun de Integer
et Number
. Je pense que dans la relation avec les caractères génériques et génériques, il est possible de dire que:
List>
Est le parent commun deList
etList
car il est nécessaire de voir le contexte du tutoriel.
Vous mélangez les concepts d’inheritance de la POO ou les types concrets avec celui des types génériques et des relations entre ces génériques.
Une phrase du didacticiel sur les caractères génériques et les sous-types dit tout:
Pour créer une relation entre ces classes … utilisez un caractère générique supérieur
Pour les relations de type génériques ?
est-ce simplement la limite la plus haute des caractères génériques possibles ? extends
? extends
(caractère générique borné supérieur),? ? super
(caractère générique borné inférieur) et le type
réel (correspondance exacte ou “caractère générique limité supérieur et inférieur”).
Les caractères génériques sont utilisés pour que les deux concepts de génériques et de POO fonctionnent parfaitement ensemble, mais ce n’est pas la même chose. En termes simples: List>
Est le parent commun de List
et List
car la relation générique est spécifiée comme telle pour que tout autre caractère générique crée une relation de sous-type avec ?
. Ceci est plus ou moins l’explication informelle, regardez la réponse de dejvuth pour les parties concrètes de la spécification.
Voici les types que les méthodes ont en Java avec les génériques:
interface Collection { ... public boolean contains(Object o); public boolean containsAll(Collection> c); ... }
La première méthode n’utilise pas de génériques du tout! La deuxième méthode est notre première vue d’une abréviation importante. Le type Collection signifie:
Collection extends Object>
L’extension de l’object est l’une des utilisations les plus courantes des caractères génériques, il est donc logique de fournir une forme abrégée pour l’écrire.