Maîtriser les génériques Java : Construire du code réutilisable et type-safe
Maîtriser les génériques Java : Construire du code réutilisable et type-safe
Les génériques Java permettent d'écrire une seule classe, interface ou méthode opérant sur de nombreux types de données différents, tout en conservant la sécurité de typage à la compilation.
Note : Les génériques ne fonctionnent pas avec les types primitifs (int, float, char, etc.).
Classe générique Java
En déclarant un paramètre de type, vous créez une classe fonctionnant avec n'importe quel type d'objet.
Exemple : Création d'une classe générique
class Main {
public static void main(String[] args) {
ClasseGenerique<Integer> objEntier = new ClasseGenerique<>(5);
System.out.println("Classe générique renvoie : " + objEntier.getDonnee());
ClasseGenerique<String> objChaine = new ClasseGenerique<>("Programmation Java");
System.out.println("Classe générique renvoie : " + objChaine.getDonnee());
}
}
class ClasseGenerique<T> {
private T donnee;
public ClasseGenerique(T donnee) {
this.donnee = donnee;
}
public T getDonnee() {
return this.donnee;
}
}
Sortie
Classe générique renvoie : 5 Classe générique renvoie : Programmation Java
ClasseGenerique est une classe générique où T est le paramètre de type. Deux instances sont créées :
- objEntier – T remplacé par
Integer, la classe travaille avec des entiers - objChaine – T remplacé par
String, la classe travaille avec des chaînes
Méthode générique Java
Les méthodes peuvent aussi être génériques, acceptant tout type d'argument tout en conservant la sécurité de typage.
Exemple : Création d'une méthode générique
class Main {
public static void main(String[] args) {
ClasseDemo demo = new ClasseDemo();
demo.<String>methodeGenerique("Programmation Java");
demo.<Integer>methodeGenerique(25);
}
}
class ClasseDemo {
public <T> void methodeGenerique(T donnee) {
System.out.println("Méthode générique :");
System.out.println("Donnée passée : " + donnee);
}
}
Sortie
Méthode générique : Donnée passée : Programmation Java Méthode générique : Donnée passée : 25
Quand le compilateur peut inférer le type, vous pouvez omettre l'argument de type explicite :
demo.methodeGenerique("Programmation Java");
Types bornés (Bounded Types)
Parfois vous voulez qu'un type générique n'accepte qu'une famille spécifique de classes. Les types bornés y parviennent avec le mot-clé extends.
Syntaxe : <T extends A> – T peut être A ou tout sous-type de A.
Exemple : Types bornés
class ClasseGenerique <T extends Number> {
public void afficher() {
System.out.println("Ceci est une classe générique à type borné.");
}
}
class Main {
public static void main(String[] args) {
// ClasseGenerique<String> obj = new ClasseGenerique<>(); // erreur de compilation
}
}
Ici, ClasseGenerique n'accepte que les types numériques (Integer, Double, etc.). Tenter de l'instancier avec String cause une erreur de compilation :
ClasseGenerique<String> obj = new ClasseGenerique<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class ClasseGenerique
Avantages des génériques Java
1. Réutilisabilité du code
Le code générique opère sur plusieurs types de données, réduisant la duplication. Une seule méthode peut traiter entiers, chaînes et objets personnalisés.
2. Vérification de type à la compilation
Le paramètre de type étant connu à la compilation, le compilateur détecte les incompatibilités de type avant l'exécution.
3. Intégration transparente avec les Collections
Le framework de collections Java est basé sur les génériques, permettant aux collections d'imposer la sécurité de typage. Exemples :
ArrayList<String> liste1 = new ArrayList<>();
ArrayList<Integer> liste2 = new ArrayList<>();
Autres classes de collection (LinkedList, Queue, Map, etc.) utilisent aussi les génériques pour les mêmes bénéfices.
Java
- Comprendre le mot-clé final en Java : variables, méthodes et classes
- L'opérateur instanceof en Java : guide complet
- Maîtriser l'héritage Java : concepts, types et exemples pratiques
- Comprendre les classes imbriquées statiques en Java : utilisation, différences et exemples
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Le pattern Singleton en Java expliqué : implémentation et utilisation sûre
- Maîtriser la réflexion Java : inspection des classes, méthodes et champs à l'exécution
- Maîtriser Java ObjectOutputStream : Sérialisation, méthodes et exemples pratiques
- Maîtriser les opérations sur les fichiers Java avec java.io – Création, lecture, écriture et suppression