Expertise Java & J2EE

Astuces et conseils pour le programmeur raffiné

septembre 2010
lun. mar. mer. jeu. ven. sam. dim.
  12345
6789101112
13141516171819
20212223242526
27282930   
       
<  août sept. oct.  >
Google
 
À propos:

Conseils et opinions sur la programmation par un ingénieur Américain en France.

Me contacter


Voir aussi:

Mon blog personnel

GetJava Download Button

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!

   Trackbacks [0]

Powered By blojsom
XML  RSS  RDF