web-dev-qa-db-fra.com

Java: cast le type de collection en sous-type

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.

36
Landon Kuhn

Vous pouvez diffuser via l'interface de liste non typée:

List<A> a = new ArrayList<A>();
List<B> b = (List)a;
45
jarnbjo

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.

16
Romain

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.

1
zakmck

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 que C<T> <: C<U>.

1
Joachim Sauer