Polymorphisme des listes génériques

Avec Java 5 les développeurs ont vu pour leur plus grand bonheur arriver dans le langage les types génériques. On allait enfin pouvoir manipuler les List, Set et Map avec un typage fort.

Par exemple avec Java 4, lorsque l'on créait une list, on pouvait y mettre n'importe quel objet :

List menagerie = new ArrayList();
menagerie.put(new Animal());
menagerie.put(new Cat());
menagerie.put(new Dog());
//arg faut pas que je fasse ça
//mais le compilateur ne dit rien 
menagerie.put(new HumanBeing());

Bien sur les risques d'erreurs étaient très élevés car le développeur était le seul garant qu'on ne mettait pas n'importe quoi dans la liste. Sans parler du code de cast que l'on devait écrire pour récupérer les type adhoc :

Iterator it = menagerie.iterator();
//cast obligatoire même si je sais que ma 
//list ne contient que des animaux
Animal animal = (Animal) it.next();

Mais en Java 5 tous ces problèmes sont "résolus" avec les types génériques (je dis résolu entre guillemet vous allez bientôt voir pourquoi).