Sobes.tech
Middle+

Čo je to princíp PECS a ako sa v Jave používa?

sobes.tech AI

Odpoveď od AI

Princíp PECS (Producer Extends Consumer Super) je mnemotechnické pravidlo na určenie, kedy používať kľúčové slová extends a super pri práci s wildcard typmi v generikách Java.

  • Producent (Producer): Keď používate generický parameter na získavanie dát (extrahovanie prvkov z kolekcie), použite wildcard s extends. Kolekcia funguje ako producent dát. Typ ? extends T znamená "akýkoľvek typ, ktorý je T alebo jeho podtriedou". Môžete bezpečne čítať prvky ako typ T (alebo jeho supertriedu), ale nemôžete pridávať prvky do takejto kolekcie (okrem null).

  • Konzument (Consumer): Keď používate generický parameter na pridávanie dát (vkladanie prvkov do kolekcie), použite wildcard s super. Kolekcia funguje ako konzument dát. Typ ? super T znamená "akýkoľvek typ, ktorý je T alebo jeho supertriedou". Môžete bezpečne pridávať prvky typu T (alebo jeho podtriedy) do takejto kolekcie, ale pri čítaní ich dostanete ako Object.

Použitie v Jave:

Používa sa s wildcard typmi (?) na zvýšenie flexibility API, ktoré pracujú s kolekciami alebo inými generickými typmi, umožňujúc im pracovať s širším rozsahom typov, pričom zachovávajú typovú bezpečnosť.

Príklady:

// Príklad Producer
// Metóda printAll číta z List
public void printAll(List<? extends Number> list) {
    // Môžeme čítať prvky ako Number (alebo Object)
    for (Number num : list) {
        System.out.println(num);
    }
    // Nemôžeme pridávať prvky (okrem null)
    // list.add(123); // Chyba kompilácie
}

// Príklad Consumer
// Metóda addNumbers pridáva do List
public void addNumbers(List<? super Integer> list) {
    // Môžeme pridávať Integer alebo jeho podtriedy
    list.add(1);
    list.add(new Integer(2));
    // list.add(new Double(3.0)); // Chyba kompilácie

    // Pri čítaní dostaneme Object
    Object o = list.get(0);
}