Sobes.tech
Middle+

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 T betekent "elke type die T of een subklasse ervan is". Je kunt elementen veilig lezen als type T (of zijn superklasse), maar je kunt geen elementen toevoegen aan zo'n collectie (behalve null).

  • 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 T betekent "elke type die T of een superklasse ervan is". Je kunt veilig elementen van type T (of zijn subklassen) toevoegen, maar bij het lezen krijg je ze als Object.

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);
}