Sobes.tech
Middle

Čo sú Generics a na čo slúžia?

sobes.tech AI

Odpoveď od AI

Generics v Jave umožňujú vytvárať triedy, rozhrania a metódy, ktoré pracujú s parametrizovanými typmi.

Hlavný účel Generics:

  • Zvýšenie typovej bezpečnosti: Kompilátor kontroluje typy počas kompilácie, čím zabraňuje ClassCastException počas behu.
  • Odstránenie potreby priameho prevodu typov: Nie je potrebné manuálne prevádzať typy pri získavaní prvkov z kolekcií.
  • Vytváranie flexibilnejšieho a opakovane použiteľného kódu: Môžeme písať všeobecné algoritmy a dátové štruktúry použiteľné pre rôzne typy dát.

Príklad bez Generics:

// Pred Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // bez typovania
        list.add("hello");
        list.add(123); // môže pridať akýkoľvek objekt

        String s = (String) list.get(0); // je potrebné prevádzať typ
        Integer i = (Integer) list.get(1); // je potrebné prevádzať typ

        // Možná chyba prevodu typu
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Príklad s Generics:

// S použitím Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // zoznam reťazcov
        list.add("hello");
        // list.add(123); // chyba kompilácie - nie je možné pridať Integer

        String s = list.get(0); // nie je potrebné prevádzať typ

        // Nie je možné pridať iný typ, zabraňuje chybe
        // List<Integer> intList = new ArrayList<>();
        // intList.add("world"); // chyba kompilácie
        System.out.println(s);
    }
}

Generics sa tiež používajú v:

  • Triedach: ArrayList<E>, HashMap<K, V>
  • Rozhraniach: List<E>, Map<K, V>
  • Metódach: <T> void printArray(T[] array)
  • Obmedzeniach typov: <T extends Comparable<T>> (obmedzenie na typy implementujúce Comparable)

Implementácia Generics v Jave je založená na "stieraní typov" (type erasure) v štádiu kompilácie. To znamená, že informácie o generovaných typoch sa odstraňujú, a počas behu JVM pracuje so surovými typmi. To zabezpečuje spätnú kompatibilitu so staršími verziami Javy, ale má určité obmedzenia.