Xavier Tarrago a écrit :
> Bonjour,
> Je me frotte aux generics java et je ne comprends pas certaines choses. D'ou
> les questions suivantes:
>
> 1 le point que je ne comprends pas est pourquoi on peut écrire
>
> ArrayList<A> a1 = null;
> ArrayList<? extends A> a2 = a1;
>
> et pas
>
> Map<String, ArrayList<A>> m1 = null;
> Map<String, ArrayList<? extends A>> m2 = m1; // erreur
>
> Type mismatch: cannot convert from Map<String,ArrayList<A>> to
> Map<String,ArrayList<? extends A>>
>
> Cordialement.
>
>
Salut,
voici pourquoi ce n'est pas autorisé :
public class A {
}
public class B extends A {
public B() {
super();
}
}
Map<String, ArrayList<A>> m1 = null;
m1.put("foo", new ArrayList<A>());
m1.put("bar", new ArrayList<B>()); // erreur il faut que ce soit A
Map<String, ArrayList<? extends A>> m2 = m1; /* erreur mais imagine que
cela passe */
m2.put("foo", new ArrayList<A>()); // ok
m2.put("bar", new ArrayList<B>()); // ok
Mais m2 c'est m1 donc tu as :
m1.put("bar", new ArrayList<B>());
qui devrait passer donc c'est tout simplement interdit de dire que :
m2 = m1;
Par contre tu peux faire :
Map<String, ? extends ArrayList<? extends A>> m3 = m1;
mais
m3.put("foo", new ArrayList<A>()); // erreur
m3.put("bar", new ArrayList<B>()); // erreur
m3.put("foo", null); // ok
donc tu peux ajouter seulement l'élément null pour les listes avec m3.
En espérant que cela t'ai aidé.