Sobes.tech
Middle

Quelles sont les possibilités dans Generics?

sobes.tech IA

Réponse de l'IA

Les génériques permettent de créer des classes, interfaces et méthodes paramétrées.

Fonctionnalités principales :

  • Réutilisation du code : Création de structures de données et d'algorithmes universels fonctionnant avec n'importe quel type.
  • Sécurité de type en compilation : Les erreurs de typage sont détectées lors de la compilation, pas à l'exécution. Élimine le besoin de conversions de type manuelles et les erreurs potentielles ClassCastException.
  • Lisibilité améliorée : Le code devient plus compréhensible car il indique clairement avec quels types il travaille.

Exemples :

  • La classe conteneur List<T> peut stocker des éléments de n'importe quel type T.
  • La méthode static <T> T getFirst(List<T> list) peut retourner le premier élément d'une liste de n'importe quel type.

Restrictions des génériques :

  • Impossible de créer des instances de types génériques : new T().
  • Impossible d'utiliser des types primitifs comme paramètres de type (par exemple, List<int> - incorrect, il faut utiliser List<Integer>).
  • Impossible de créer directement des tableaux de types génériques (par exemple, T[] array = new T[10] - incorrect, il faut utiliser ArrayList ou faire un cast).
  • Impossible d'utiliser directement des champs statiques de types génériques.
  • L'information de type est effacée à l'exécution (Type Erasure), sauf pour les wildcards bornés.

Wildcards et paramètres de type bornés :

  • <?> : Type inconnu. Permet de lire des éléments, mais pas d'écrire.
  • <? extends T> : Limite supérieure. Permet de travailler avec des types qui sont sous-types de T. On peut lire des éléments de type T ou ses super-types, mais pas écrire (sauf null).
  • <? super T> : Limite inférieure. Permet de travailler avec des types qui sont super-types de T. On peut écrire des éléments de type T ou ses sous-types, mais en lecture, on ne peut que récupérer des Object.

Exemple :

// Méthode qui peut imprimer des éléments de n'importe quelle liste,
// contenant des sous-types de Number
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Erreur de compilation
}

// Méthode qui peut ajouter des Integer à une liste,
// contenant Integer ou ses super-types
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Erreur de compilation, retourne Object
}