Sobes.tech
Middle

Aké sú možnosti v Generics?

sobes.tech AI

Odpoveď od AI

Generik umožňujú vytvárať parametrizované triedy, rozhrania a metódy.

Hlavné možnosti:

  • Znovupoužiteľnosť kódu: Vytváranie univerzálnych štruktúr dát a algoritmov, ktoré fungujú s akýmikoľvek typmi.
  • Bezpečnosť typov počas kompilácie: Chyby typov sa odhaľujú v štádiu kompilácie, nie počas behu. Odstraňuje potrebu manuálneho prevodu typov a súvisiacich potenciálnych chýb ClassCastException.
  • Vylepšená čitateľnosť: Kód je jasnejší, pretože výslovne ukazuje, s akými typmi pracuje.

Príklady:

  • Trieda-kontejner List<T> môže ukladať prvky akéhokoľvek typu T.
  • Metóda static <T> T getFirst(List<T> list) môže vracať prvý prvok zo zoznamu akéhokoľvek typu.

Obmedzenia Generics:

  • Nie je možné vytvárať inštancie generického typu: new T().
  • Nie je možné používať primitívne typy ako parametre typu (napríklad List<int> - nesprávne, je potrebné List<Integer>).
  • Nie je možné priamo vytvárať polia generických typov (napríklad T[] array = new T[10] - nesprávne, je potrebné použiť ArrayList alebo konverziu typov).
  • Nie je možné používať statické polia generického typu priamo.
  • Informácie o typoch sa strácajú počas behu (Type Erasure), okrem bounded wildcards.

Wildcards a Bounded Type Parameters:

  • <?>: Neznámy typ. Umožňuje čítať prvky, ale nie písať.
  • <? extends T>: Horné obmedzenie. Umožňuje pracovať s typmi, ktoré sú podtypmi T. Môže čítať prvky typu T alebo jeho supertypov, ale nie písať (okrem null).
  • <? super T>: Dolné obmedzenie. Umožňuje pracovať s typmi, ktoré sú supertypmi T. Môže písať prvky typu T alebo jeho podtypov, ale čítať len prvky typu Object. Príklad:
// Metóda, ktorá môže vypísať prvky z ľubovoľného zoznamu,
// ktorý obsahuje podtypy Number
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
    // list.add(new Integer(1)); // Chyba kompilácie
}

// Metóda, ktorá môže pridávať Integer do zoznamu,
// ktorý obsahuje Integer alebo jeho supertypy
public static void addIntegers(List<? super Integer> list) {
    list.add(new Integer(10));
    // Integer val = list.get(0); // Chyba kompilácie, vracia Object
}