Sobes.tech
Middle+

Co je to princip PECS a jak se používá v Java?

sobes.tech AI

Odpověď od AI

Princip PECS (Producer Extends Consumer Super) je mnemotechnické pravidlo, které určuje, kdy používat klíčová slova extends a super při práci s wildcard typy v generikách Java.

  • Producent (Producer): Pokud používáte generický parametr k získávání dat (extrahování prvků z kolekce), použijte wildcard s extends. Kolekce funguje jako producent dat. Typ ? extends T znamená "libovolný typ, který je T nebo jeho podtřídou". Můžete bezpečně číst prvky jako typ T (nebo jeho nadtřídu), ale nemůžete přidávat prvky do takové kolekce (kromě null).

  • Konzument (Consumer): Pokud používáte generický parametr k přidávání dat (vkládání prvků do kolekce), použijte wildcard s super. Kolekce funguje jako konzument dat. Typ ? super T znamená "libovolný typ, který je T nebo jeho nadtřídou". Můžete bezpečně přidávat prvky typu T (nebo jeho podtříd), ale při čtení dostanete prvky jako Object.

Použití v Java:

Používá se s wildcard typy (?) ke zvýšení flexibility API, které pracují s kolekcemi nebo jinými generickými typy, umožňujícími jim pracovat s širším rozsahem typů, přičemž zachovávají typovou bezpečnost.

Příklady:

// Příklad Producer
// Metoda printAll čte z List
public void printAll(List<? extends Number> list) {
    // Můžeme číst prvky jako Number (nebo Object)
    for (Number num : list) {
        System.out.println(num);
    }
    // Nemůžeme přidávat prvky (kromě null)
    // list.add(123); // Chyba kompilace
}

// Příklad Consumer
// Metoda addNumbers přidává do List
public void addNumbers(List<? super Integer> list) {
    // Můžeme přidávat Integer nebo jeho podtřídy
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Chyba kompilace

    // Při čtení dostaneme Object
    Object o = list.get(0);
}