L'Essentiel du Cours : La Généricité en Java
Fiche de Révision Technique — Format Condensé
1. Objectif Fondamental & Syntaxe
• But unique : Écrire un code source unique pour manipuler des types d'objets quelconques de manière sécurisée.
• Avantage : Sécurité des types à la compilation (Type Safety). Supprime le besoin de transtypage manuel ( cast ) et
élimine tout risque de ClassCastException à l'exécution.
• Syntaxe de base :
public class Boite<T> {
private T x;
public T getX() { return x; }
public void setX(T x) { this.x = x; }
}
• Règle stricte des types : Seuls les types objets sont acceptés. Interdiction d'utiliser des types primitifs ( int , double ,
etc.). Utiliser les classes enveloppes ( Integer , Double ).
• Raw Types (Types Bruts) : Instancier sans spécifier le type (ex: Boite b = new Boite(); ) rétrograde T en Object ,
désactive la sécurité et génère un avertissement à la compilation.
2. Mécanisme Interne : L'Effacement de Type (Type Erasure)
• La Machine Virtuelle Java (JVM) ne connaît pas la généricité (préservation de la compatibilité ascendante).
• Le compilateur effectue la vérification des types, puis efface toutes les informations génériques (les chevrons) dans le
bytecode.
• Les types non bornés deviennent Object . Les types bornés prennent le type de leur borne supérieure. Le compilateur
ajoute lui-même les instructions de cast nécessaires.
3. Les 6 Interdictions Absolues à retenir
1. Interdit d'instancier directement un type générique : T obj = new T();
2. Interdit de créer un tableau de type générique : T[] tab = new T[10];
3. Interdit de créer un tableau d'instances génériques spécifiques : Boite<Integer>[] t = new Boite<Integer>[5];
4. Interdit d'utiliser instanceof paramétré : if (b instanceof Boite<String>) (Seul b instanceof Boite est
légal).
5. Interdit de créer une classe d'exception générique : class MyException<T> extends Exception .
6. Interdit de déclarer des variables statiques de type T : static T variable; (partagé par toutes les instances).
4. Méthodes Génériques
• Une méthode peut définir ses propres paramètres de types, indépendamment de sa classe. Le paramètre se place
obligatoirement avant le type de retour :
public static <T> T getMilieu(T[] tab) { return tab[[Link] / 2]; }
• Appel explicite : Permet de forcer le type si l'inférence automatique du compilateur échoue ou doit être verrouillée :
NomClasse.<String>getMilieu(monTab);
5. Bornes sur les Paramètres (Bounded Types)
• Borne Supérieure ( <T extends Type> ) : Limite le type aux sous-classes ou implémentations de Type . Après
effacement, le bytecode remplace T par Type au lieu d' Object .
• Bornes multiples : Combinées avec l'opérateur & (ex: <T extends Classe & Interface1 & Interface2> ). La
classe doit impérativement figurer en première position.
• Borne Inférieure ( <T super Type> ) : Limite le type générique à Type ou à l'une de ses super-classes (classes
parentes).
POO2 - Résumé Généricité en Java 1
6. Héritage et Non-Covariance (Le Piège de l'Examen)
Règle d'or : Même si Integer hérite de Number , Boite<Integer> n'a aucun lien de parenté avec
Boite<Number> .
L'affectation suivante provoque une Erreur de compilation immédiate :
Boite<Number> b = new Boite<Integer>(); // FAUX et INTERDIT
• Extension de classe générique : Une sous-classe doit obligatoirement propager au moins les paramètres requis par sa
super-classe : class Enfant<T> extends Parent<T> .
7. Les Jokers (Wildcards '?')
Utilisés exclusivement lors de la déclaration de variables, de champs ou de paramètres (jamais avec l'opérateur new ) pour
résoudre le problème de la non-covariance :
Syntaxe du Joker Désignation Usage Précis & Comportement
Représente un type totalement inconnu. Utilisé pour la
Boite<?> Joker non borné lecture seule. Les éléments récupérés sont traités comme
de type Object .
Représente T ou l'une de ses sous-classes. Permet la
Boite<? extends T> Borne Supérieure lecture sécurisée des méthodes propres à T . Interdiction
stricte d'y ajouter des éléments.
Représente T ou l'une de ses super-classes. Conçu
Boite<? super T> Borne Inférieure spécifiquement pour l'écriture sécurisée dans une
structure (ex: [Link](instanceDeT); ).
POO2 - Résumé Généricité en Java 2