Qu'est-ce que le principe PECS et comment est-il appliqué en Java?
sobes.tech IA
Réponse de l'IA
Le principe PECS (Producer Extends Consumer Super) est une règle mnémotechnique pour déterminer quand utiliser les mots-clés extends et super lors de la manipulation de types joker dans les génériques Java.
-
Producteur (Producer): Lorsque vous utilisez un paramètre générique pour obtenir des données (extraire des éléments d'une collection), utilisez un joker avec
extends. La collection agit comme un producteur de données. Le type? extends Tsignifie "tout type qui estTou sa sous-classe". Vous pouvez lire en toute sécurité des éléments comme typeT(ou sa super-classe), mais vous ne pouvez pas ajouter d'éléments à une telle collection (saufnull). -
Consommateur (Consumer): Lorsque vous utilisez un paramètre générique pour ajouter des données (mettre des éléments dans une collection), utilisez un joker avec
super. La collection agit comme un consommateur de données. Le type? super Tsignifie "tout type qui estTou sa super-classe". Vous pouvez ajouter en toute sécurité des éléments de typeT(ou ses sous-classes) à une telle collection, mais lors de la lecture, vous obtiendrez des éléments commeObject.
Application en Java:
Utilisé avec des types joker (?) pour augmenter la flexibilité des API travaillant avec des collections ou d'autres types génériques, leur permettant de fonctionner avec une gamme plus large de types tout en maintenant la sécurité de type.
Exemples:
// Exemple Producteur
// La méthode printAll lit d'une List
public void printAll(List<? extends Number> list) {
// Nous pouvons lire des éléments comme Number (ou Object)
for (Number num : list) {
System.out.println(num);
}
// Nous ne pouvons pas ajouter d'éléments (sauf null)
// list.add(123); // Erreur de compilation
}
// Exemple Consommateur
// La méthode addNumbers ajoute à une List
public void addNumbers(List<? super Integer> list) {
// Nous pouvons ajouter Integer ou ses sous-classes
list.add(1);
list.add(new Integer(2));
// list.add(new Double(3.0)); // Erreur de compilation
// Lors de la lecture, on obtient Object
Object o = list.get(0);
}