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ýtTnebo jeho podtyp.? super T(Bounded Wildcard - dolní mez): Typ musí býtTnebo 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.