Wat is het PECS-principe en hoe wordt het toegepast in Java?
sobes.tech AI
Antwoord van AI
Het PECS-principe (Producer Extends Consumer Super) is een ezelsbruggetje om te bepalen wanneer je de sleutelwoorden extends en super moet gebruiken bij het werken met wildcard-typen in Java-generics.
-
Producer (Producent): Wanneer je een generiek parameter gebruikt om gegevens te verkrijgen (elementen uit een collectie te halen), gebruik dan een wildcard met
extends. De collectie fungeert als een gegevensproducent. Het type? extends Tbetekent "elke type dieTof een subklasse ervan is". Je kunt elementen veilig lezen als typeT(of zijn superklasse), maar je kunt geen elementen toevoegen aan zo'n collectie (behalvenull). -
Consumer (Consument): Wanneer je een generiek parameter gebruikt om gegevens toe te voegen (elementen in een collectie te plaatsen), gebruik dan een wildcard met
super. De collectie fungeert als een gegevensverbruiker. Het type? super Tbetekent "elke type dieTof een superklasse ervan is". Je kunt veilig elementen van typeT(of zijn subklassen) toevoegen, maar bij het lezen krijg je ze alsObject.
Toepassing in Java:
Gebruikt met wildcard-typen (?) om de flexibiliteit van API's die met collecties of andere generieke typen werken te vergroten, zodat ze kunnen werken met een breder scala aan typen, terwijl de typeveiligheid behouden blijft.
Voorbeelden:
// Voorbeeld Producer
// De methode printAll leest uit een List
public void printAll(List<? extends Number> list) {
// We kunnen elementen lezen als Number (of Object)
for (Number num : list) {
System.out.println(num);
}
// We kunnen geen elementen toevoegen (behalve null)
// list.add(123); // Compileerfout
}
// Voorbeeld Consumer
// De methode addNumbers voegt toe aan een List
public void addNumbers(List<? super Integer> list) {
// We kunnen Integer of subklassen toevoegen
list.add(1);
list.add(new Integer(2));
// list.add(new Double(3.0)); // Compileerfout
// Bij het lezen krijgen we Object
Object o = list.get(0);
}