Sobes.tech
Middle

Qu'est-ce que les Génériques et à quoi servent-ils?

sobes.tech IA

Réponse de l'IA

Les génériques en Java permettent de créer des classes, interfaces et méthodes qui fonctionnent avec des types paramétrés.

L'objectif principal des génériques :

  • Amélioration de la sécurité de type : Le compilateur vérifie les types lors de la compilation, évitant ainsi ClassCastException à l'exécution.
  • Suppression des conversions de type : Il n'est pas nécessaire de convertir manuellement les types lors de l'extraction d'éléments des collections.
  • Création de code plus flexible et réutilisable : On peut écrire des algorithmes et structures de données génériques applicables à différents types de données.

Exemple sans génériques :

// Avant Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // sans typage
        list.add("bonjour");
        list.add(123); // peut ajouter n'importe quel objet

        String s = (String) list.get(0); // nécessite une conversion de type
        Integer i = (Integer) list.get(1); // nécessite une conversion de type

        // Peut entraîner une erreur de conversion
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Exemple avec génériques :

// Avec génériques
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // liste de chaînes
        list.add("bonjour");
        // list.add(123); // erreur de compilation - ne peut pas ajouter Integer

        String s = list.get(0); // pas besoin de conversion de type

        // Impossible d'ajouter un autre type, évite les erreurs
        // List<Integer> intList = new ArrayList<>();
        // intList.add("monde"); // erreur de compilation
        System.out.println(s);
    }
}

Les génériques sont également utilisés dans :

  • Classes : ArrayList<E>, HashMap<K, V>
  • Interfaces : List<E>, Map<K, V>
  • Méthodes : <T> void printArray(T[] array)
  • Restrictions de types : <T extends Comparable<T>> (restriction aux types qui implémentent Comparable)

L'implémentation des génériques en Java est basée sur "l'effacement de types" (type erasure) lors de la compilation. Cela signifie que l'information sur les types génériques est supprimée, et à l'exécution, la JVM opère avec des types bruts. Cela garantit la compatibilité avec les anciennes versions de Java, mais présente certaines limitations.