Les génériques permettent de créer des classes, des interfaces et des méthodes avec des paramètres de type, ce qui assure une vérification de type au moment de la compilation et aide à éviter ClassCastException.
Caractéristiques clés et pièges :
new List<String>[10] — erreur de compilation.T obj = new T();if(obj instanceof List<String>) — erreur.? extends T — covariance (lecture), ? super T — contravariance (écriture).Exemple :
// Approche covariante pour la lecture void printNumbers(List<? extends Number> numbers) { for (Number n : numbers) { System.out.println(n); } } // Approche contravariante pour l'écriture void addIntegers(List<? super Integer> list) { list.add(10); }
Question : "Quelles sont les différences entre List<Object> et List<?> ? Peut-on ajouter n'importe quel objet dans List<?> ?"
Réponse : Non, dans List<?> on ne peut rien ajouter (sauf null), car le compilateur ne sait pas quel type de paramètre il y a. Dans List<Object>, on peut ajouter n'importe quel objet.
Exemple :
List<?> list1 = new ArrayList<String>(); // list1.add("test"); // Erreur de compilation ! List<Object> list2 = new ArrayList<>(); list2.add("test"); // OK
Histoire
L'équipe de développeurs a essayé de mettre en œuvre un cache basé sur un tableau de type paramétré
T[]. En raison de l'effacement de type et de l'incapacité à créer des tableaux de type générique, la solution ne fonctionnait pas comme prévu : un tableauObject[]était obtenu, entraînant ClassCastException lors des conversions runtime.
Histoire
Dans l'un des microservices, un développeur a essayé de mettre en œuvre un récepteur utilisant List<?> comme paramètre, et a tenté de modifier la collection. Cela a provoqué une erreur de compilation et a retardé la sortie, car il a fallu refactoriser la logique en tenant compte du PECS.
Histoire
Dans un projet d'intégration avec un système externe, un développeur a commis une erreur en écrasant une collection d'un type par une autre via un type brut non traité : List list = new ArrayList<String>(), ce qui a conduit à ClassCastException et des pannes du service en production lors de la tentative de conversion des éléments à d'autres types.