Sobes.tech
Middle

Jaké možnosti nabízí Generics v Java?

sobes.tech AI

Odpověď od AI

Generika v Javě zvyšují bezpečnost typů kódu tím, že předcházejí chybám za běhu souvisejícím s přetypováním. Hlavní možnosti:

  • Kontrola typů při kompilaci: Kompilátor ověřuje správné použití typů uvedených v generikách, což umožňuje odhalit chyby před spuštěním programu.

    // Bez generik - může dojít k ClassCastException
    List list = new ArrayList();
    list.add("řetězec");
    list.add(123); // Přidání Integer
    String s = (String) list.get(1); // Chyba za běhu
    
    // S generiky - chyba při kompilaci
    List<String> stringList = new ArrayList<>();
    stringList.add("řetězec");
    // stringList.add(123); // Chyba při kompilaci
    String str = stringList.get(0); // Bezpečné získání
    
  • Odstranění přetypování (type casting): Generika odstraňují potřebu explicitního přetypování při získávání prvků z kolekcí nebo používání parametrizovaných tříd.

    // Bez generik
    List list = new ArrayList();
    list.add("Ahoj");
    String s = (String) list.get(0); // Explicitní přetypování
    
    // S generiky
    List<String> stringList = new ArrayList<>();
    stringList.add("Ahoj");
    String str = stringList.get(0); // Přetypování není potřeba
    
  • Obecný kód (Generics Methods, Generics Classes, Generics Interfaces): Umožňují vytvářet obecné algoritmy a datové struktury, které pracují s různými typy, aniž by bylo nutné duplikovat kód.

    // Obecná metoda pro tisk pole
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Obecná třída - pár hodnot
    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í definovat flexibilní omezení typů v parametrizovaných typech.

    • ? (Unbounded Wildcard): Jakýkoli typ.
    • ? extends T (Bounded Wildcard - horní mez): Typ musí být T nebo jeho podtyp.
    • ? super T (Bounded Wildcard - dolní mez): Typ musí být T nebo jeho supertřída.
    // Metoda přijímající seznam jakéhokoli typu
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metoda přijímající seznam čísel nebo jejich podtypů
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metoda přijímající seznam řetězců nebo jejich supertřídy
    public static void addStrings(List<? super String> list) {
        list.add("nový řetězec");
    }
    
  • Použití v rámci Collections Framework: Všechny hlavní třídy kolekcí (List, Set, Map atd.) jsou parametrizované, což činí práci s kolekcemi typově bezpečnou a pohodlnou.

Generika jsou klíčovým prvkem moderní Javy, zvyšují spolehlivost a čitelnost kódu.