Supposons que la classe B
étend la classe A
. J'ai un List<A>
que je connais seulement contient des instances de B
. Existe-t-il un moyen de lancer le List<A>
à un List<B>
?
Il semble que ma seule option soit de parcourir la collection, de couler un élément à la fois, de créer une nouvelle collection. Cela semble être un gaspillage total de ressources étant donné que l'effacement de type rend cela complètement inutile au moment de l'exécution.
Vous pouvez diffuser via l'interface de liste non typée:
List<A> a = new ArrayList<A>();
List<B> b = (List)a;
Vous pouvez essayer ceci:
List<A> a = new ArrayList<A>();
List<B> b = (List<B>) (List<?>) a;
Il est basé sur la réponse de jarnbjo, mais n'utilise pas de listes brutes.
Un moyen de conserver une certaine sécurité de type avec un impact minimal sur les performances consiste à utiliser un wrapper . Cet exemple concerne Collection, le cas List serait très similaire et peut-être qu'un jour je l'écrirai aussi. Si quelqu'un d'autre vient avant moi, partageons le code.
List<A>
n'est pas un sous-type de List<B>
!
Le JLS le mentionne même explicitement :
Le sous-typage ne s'étend pas aux types génériques:
T <: U
n'implique pas queC<T> <: C<U>
.