La syntaxe pour ce type d'affectation utilise un caractère de remplacement :
List<SubClass> subs = ...;
List<? extends BaseClass> bases = subs;
Il est important de comprendre qu'un List<SubClass>
est pas interchangeable avec un List<BaseClass>
. Code qui conserve une référence à la List<SubClass>
s'attendra à ce que chaque élément de la liste soit un fichier de type SubClass
. Si une autre partie du code se réfère à la liste en tant que List<BaseClass>
le compilateur ne se plaindra pas lorsqu'un BaseClass
ou AnotherSubClass
est inséré. Mais cela provoquera un ClassCastException
pour le premier morceau de code, qui suppose que tout ce qui se trouve dans la liste est une SubClass
.
Les collections génériques ne se comportent pas de la même manière que les tableaux en Java. Les tableaux sont covariants, c'est-à-dire qu'il est permis de faire cela :
SubClass[] subs = ...;
BaseClass[] bases = subs;
Cela est autorisé, car le tableau "connaît" le type de ses éléments. Si quelqu'un tente de stocker quelque chose qui n'est pas une instance de SubClass
dans le tableau (via la fonction bases
), une exception d'exécution sera déclenchée.
Les collections génériques font pas "connaissent" leur type de composant ; cette information est "effacée" au moment de la compilation. Par conséquent, ils ne peuvent pas lever une exception d'exécution lorsqu'un magasin invalide se produit. Au lieu de cela, un ClassCastException
sera soulevée à un moment éloigné et difficile à associer dans le code lorsqu'une valeur est lue dans la collection. Si vous tenez compte des avertissements du compilateur concernant la sécurité des types, vous éviterez ces erreurs de type au moment de l'exécution.
3 votes
La réponse que vous avez ici : stackoverflow.com/questions/662508/