Sobes.tech
Middle+

Czym jest zasada PECS i jak jest stosowana w Java?

sobes.tech AI

Odpowiedź od AI

Zasada PECS (Producer Extends Consumer Super) to mnemotechniczna zasada określająca, kiedy używać słów kluczowych extends i super podczas pracy z typami wildcard w generykach Java.

  • Producent (Producer): Gdy używasz parametru generycznego do pobierania danych (wyciągania elementów z kolekcji), użyj wildcard z extends. Kolekcja działa jako producent danych. Typ ? extends T oznacza "dowolny typ, który jest T lub jego podklasą". Możesz bezpiecznie odczytywać elementy jako typ T (lub jego superklasę), ale nie możesz dodawać elementów do takiej kolekcji (z wyjątkiem null).

  • Konsument (Consumer): Gdy używasz parametru generycznego do dodawania danych (wstawiania elementów do kolekcji), użyj wildcard z super. Kolekcja działa jako konsument danych. Typ ? super T oznacza "dowolny typ, który jest T lub jego superklasą". Możesz bezpiecznie dodawać elementy typu T (lub jego podklas) do takiej kolekcji, ale podczas odczytu otrzymasz je jako Object.

Zastosowanie w Java:

Używa się z wildcard-typami (?), aby zwiększyć elastyczność API pracujących z kolekcjami lub innymi typami generycznymi, pozwalając im działać na szerszym zakresie typów, zachowując jednocześnie bezpieczeństwo typów.

Przykłady:

// Przykład Producer
// Metoda printAll odczytuje z List
public void printAll(List<? extends Number> list) {
    // Możemy odczytywać elementy jako Number (lub Object)
    for (Number num : list) {
        System.out.println(num);
    }
    // Nie możemy dodawać elementów (z wyjątkiem null)
    // list.add(123); // Błąd kompilacji
}

// Przykład Consumer
// Metoda addNumbers dodaje do List
public void addNumbers(List<? super Integer> list) {
    // Możemy dodawać Integer lub jego podklasy
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Błąd kompilacji

    // Podczas odczytu otrzymujemy Object
    Object o = list.get(0);
}