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….
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 { }
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.