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ťTalebo jeho podtyp.? super T(Bounded Wildcard - Dolná hranica): Typ musí byťTalebo 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.