Sobes.tech
Middle

Aké možnosti poskytujú Generics v Jave?

sobes.tech AI

Odpoveď od AI

Generik v Jave zvyšujú bezpečnosť typov kódu tým, že zabraňujú chybám za behu súvisiacim s pretypovaním. Hlavné možnosti:

  • Kontrola typov počas kompilácie: Kompilátor kontroluje správnosť použitia typov uvedených v generikách, čo umožňuje odhaliť chyby pred spustením programu.

    // Bez generík - možný ClassCastException
    List list = new ArrayList();
    list.add("reťazec");
    list.add(123); // Pridanie Integer
    String s = (String) list.get(1); // Chyba počas behu
    
    // S generikami - chyba pri kompilácii
    List<String> stringList = new ArrayList<>();
    stringList.add("reťazec");
    // stringList.add(123); // Chyba pri kompilácii
    String str = stringList.get(0); // Bezpečné získanie
    
  • Odstránenie pretypovania (type casting): Generiká odstraňujú potrebu explicitného pretypovania pri získavaní prvkov z kolekcií alebo používaní parametrizovaných tried.

    // Bez generík
    List list = new ArrayList();
    list.add("Ahoj");
    String s = (String) list.get(0); // Explicitné pretypovanie
    
    // S generikami
    List<String> stringList = new ArrayList<>();
    stringList.add("Ahoj");
    String str = stringList.get(0); // Nie je potrebné pretypovanie
    
  • Všeobecný kód (Generics Methods, Generics Classes, Generics Interfaces): Umožňujú vytváranie všeobecných algoritmov a štruktúr dát, ktoré pracujú s rôznymi typmi, bez duplikácie kódu.

    // Všeobecná metóda na tlač poľa
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Všeobecná trieda - pár hodnôt
    class Pair<K, V> {
        private K key;
        private V value;
    
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
    
        public K getKey() { return key; }
        public V getValue() { return value; }
    }
    
  • Podpora Wildcards: Umožňujú definovať flexibilné obmedzenia na typy v parametrizovaných typoch.

    • ? (Unbounded Wildcard): Akýkoľvek typ.
    • ? extends T (Bounded Wildcard - Horná hranica): Typ musí byť T alebo jeho podtyp.
    • ? super T (Bounded Wildcard - Dolná hranica): Typ musí byť T alebo jeho supertrieda.
    // Metóda, ktorá prijíma zoznam akéhokoľvek typu
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metóda, ktorá prijíma zoznam čísel alebo ich podtypov
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metóda, ktorá prijíma zoznam reťazcov alebo ich supertriedy
    public static void addStrings(List<? super String> list) {
        list.add("nový reťazec");
    }
    
  • Použitie v rámci Collections Framework: Všetky hlavné triedy kolekcií (List, Set, Map a pod.) sú parametrizované, čo robí prácu s kolekciami typovo bezpečnou a pohodlnou.

Generiká sú kľúčovým prvkom modernej Javy, zvyšujú spoľahlivosť a čitateľnosť kódu.