Pages

lundi 15 juin 2015

Est ce que vous maîtrisez les types génériques en Java ?

Je vais revenir dans cet article sur la conférence d'Olivier Croisier au Breizhcamp 2015. 



Olivier a choisi de parler des type génériques, chapitre extrait de sa formation Java master class. Vous me direz, quel est l'intérêt de revenir sur une fonctionnalité qui remonte à Java 5 ? Certes les types génériques on révolutionné la manière dont on écrit les applications mais tout le monde connaît déjà le concept….

Très bien... savez vous quelles sont les différences entre List, List<Object>, et List<?> ... Alors ??

Le but initial des Generics était de supprimer les ClassCastException. Avant les API comme celle des collections manipulaient toujours des types Object et rien ne nous empêchait de mélanger des objets de types différents. Les types génériques permettent de corriger ces problèmes en détectant la plupart des problèmes à la compilation….

Regardons ce qu'il se passe avec les Generics avec une ArrayList. Nous allons énumérer les différents cas, en prenant le modèle objet suivant

    class Conference implements Serializable {
    }

    class MixIT extends Conference {
    }

    class Breizhcamp extends Conference {
    }


Le code que nous allons utiliser pour nos tests est le suivant

        List<Conference> confs = new ArrayList<>();
        confs.add(new Object());
        confs.add(new Conference());
        confs.add(new MixIT());
        confs.add(new Breizhcamp());
       

        Object o0 = confs.get(0);
        Conference o2 = confs.get(0);
        MixIT o3 = confs.get(0);
        Breizhcamp o4 = confs.get(0);

Notre but est de voir les expressions qui compilent ou non quand on joue avec le type générique associé à la liste.

Méthode Type List
rawtype
List<?> List<? extends Conference> List<? super Conference> List<Conference>
add Object ok
Conference ok ok ok
Breizhcamp ok ok ok
MixIT ok ok ok
get Object ok ok ok ok ok
Conference ok ok
Breizhcamp
MixIT


Nous allons pouvoir répondre à la question initiale
List vous ne préciser pas le type vous pouvez tout insérer mais ne pourrez que lire des Object
List<Object> nous avons le même comportement.
List<?>  ne permet que de lire une valeur Object

Jouer sur les générics (utilisation de extends, super), permet d'imposer des limites quand vous écrivez une API. En gros au départ on ne précise rien. Sur une seconde passe nous pouvons privilégier la lecture (extends) ou l'écriture (super). Pour plus d'info voir PECS (Producer extends Consumer super)


Un objet est réifiable quand ses informations de typage ne sont pas perdues à la compilation. Certaines opérations ne sont pas autorisées sur des objets non réifiables. Par exemple nous ne pouvons pas faire un instance of. Les types génériques ne sont pas réifiables et c'est pourquoi nous ne pouvons pas faire par exemple un

instance List<Conference>

Ce serait pratique dans certains cas mais il ne faut pas oublier que le JDK se doit d'être rétrocompatible d'une version à l'autre. Cette contrainte explique certaines limitations dans les implémentations.

Alors vous connaissiez vraiment tout sur les types génériques ?

Je vais m'arrêter ici dans ma retranscription car le reste était sur des points plus connus. Si vous voulez en savoir plus sur le langage Java je vous conseille de suivre la formation d'Olivier.  

Aucun commentaire:

Enregistrer un commentaire

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.