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 typeT. - 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 utiliserList<Integer>). - Impossible de créer directement des tableaux de types génériques (par exemple,
T[] array = new T[10]- incorrect, il faut utiliserArrayListou 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 deT. On peut lire des éléments de typeTou ses super-types, mais pas écrire (saufnull).<? super T>: Limite inférieure. Permet de travailler avec des types qui sont super-types deT. On peut écrire des éléments de typeTou ses sous-types, mais en lecture, on ne peut que récupérer desObject.
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
}