Astuce: utiliser extends avec les génériques [Permalink]
Wed May 21 22:51:21 CEST 2008
(L'idée pour cet article vient d'un blog en anglais de John Zukowski.)
Java 5 a introduit au langage Java les génériques, et depuis il est devenu beaucoup plus agréable de coder en Java. Alors qu'avant on avait un objet List, et chaque fois qu'on itérait dessus il fallait se souvenir du type des objets qu'on avait mis dedans pour faire un cast ("String s = (String) s.iterator().next();"), maintenant on peut simplement déclarer qu'on a un List<String> et ce n'est plus nécessaire d'avoir des casts partout.
Cependant, il y a un comportement bizarre qu'on constate avec ces génériques lorsqu'on veut en utiliser comme paramètre à une méthode. Regardons un petit exemple :
public static void main(String[] args) {
List arg = new ArrayList<String[]>();
String[] a = {"a", "b", "c"};
String[] b = {"d", "e", "f"};
arg.add(a);
arg.add(b);
System.out.println("Notre liste applati a " + applatirList(arg).size() + " éléments");
return;
}
private static List applatirList(List<Object[]> list) {
List result = new ArrayList();
for (Object[] array : list)
result.addAll(Arrays.asList(array));
return result;
}
Mais quand on compile ce programme, on a l'erreur "Test.java:19: applatirList(java.util.List<java.lang.Object[]>) in Test cannot be applied to (java.util.List<java.lang.String[]>)". En effet, contrairement au comportément des objets en général, les génériques par défaut ne sont valables que pour le classe même, mais pas forcément ses classes filles ! (J'avoue que je trouve ce comportement un peu illogique, mais c'est le compilateur qui décide.)
La solution, c'est de modifier notre signature de méthode comme suit :
private static List applatirList(List<? extends Object[]> list)Maintenant la méthode acceptera n'importe lequel type de liste, de moment que son type générique est Object[] ou une classe fille de Object[].
Pensez donc à utiliser ? extends avec vos génériques pour rendre plus souple vos interfaces!
Trackback for this entry
http://java.craven.fr/blog/java/Java/?permalink=Astuce-utiliser-extends-avec-les-generiques.html&tb=y