Les collections génériques permettent de préciser le type statique des objets
contenus dans une collection, ce type est Object pour
une collection non-générique.
ArrayList<ICompteur> autreListe = new ArrayList<ICompteur>();
La collection autreListe peut contenir uniquement des éléments de type
compatible avec le ICompteur.
autreListe.add(new Compteur()); // Compteur implémente ICompteur
autreListe.add(new CompteurModulo()); // CompteurModulo hérite de Compteur
autreListe.add("rouge"); /* n'est PAS autorisé car String n'est pas compatible avec ICompteur*/
La classe ArrayList<ICompteur> a en fait
une méthode add(ICompteur o); qui permet d'ajouter uniquement
des ICompteur et une méthode
ICompteur get(int indice); qui permet de récupérer les
ICompteur contenus. Ainsi, l'expression
autreListe.get(0) est de type statique ICompteur
et l'instruction autreListe.get(0).incrementer(); est donc autorisée.
Jusqu'au JDK1.5 il n'y avait pas de moyens pour éviter de remonter à la classe
Object lorsqu'on utilisait des collections. Ceci engendrait
plusieurs erreurs dynamiques de transtypage. Les collections génériques ont été
introduites dans la définition de Java2 1.5, en partie pour éviter ces erreurs.