Sobes.tech
Middle

Co jsou Generics a k čemu slouží?

sobes.tech AI

Odpověď od AI

Generika v Javě umožňují vytvářet třídy, rozhraní a metody, které pracují s parametrizovanými typy.

Hlavní účel generik:

  • Zvýšení bezpečnosti typů: Kompilátor kontroluje typy v době kompilace, čímž předchází ClassCastException při běhu.
  • Odstranění nutnosti převodů typů: Není třeba ručně převádět typy při získávání prvků z kolekcí.
  • Vytváření flexibilnějšího a znovupoužitelného kódu: Můžete psát obecné algoritmy a datové struktury, které jsou použitelné pro různé typy dat.

Příklad bez generik:

// Před Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // bez typování
        list.add("ahoj");
        list.add(123); // lze přidat jakýkoli objekt

        String s = (String) list.get(0); // je potřeba převod typu
        Integer i = (Integer) list.get(1); // je potřeba převod typu

        // Může dojít k chybě převodu typu
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Příklad s generiky:

// S generiky
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // seznam řetězců
        list.add("ahoj");
        // list.add(123); // chyba kompilace - nelze přidat Integer

        String s = list.get(0); // není potřeba převod typu

        // Nelze přidat jiný typ, což zabraňuje chybám
        // List<Integer> intList = new ArrayList<>();
        // intList.add("svět"); // chyba kompilace
        System.out.println(s);
    }
}

Generika se také používají v:

  • Třídách: ArrayList<E>, HashMap<K, V>
  • Rozhraních: List<E>, Map<K, V>
  • Metodách: <T> void printArray(T[] array)
  • Omezeních typů: <T extends Comparable<T>> (omezení na typy implementující Comparable)

Implementace generik v Javě je založena na "vymazání typů" (type erasure) v době kompilace. To znamená, že informace o generických typech jsou odstraněny a při běhu JVM pracuje s holými typy. To zajišťuje zpětnou kompatibilitu s staršími verzemi Javy, ale má určitá omezení.