Middle
Čo sú Generics a na čo slúžia?
sobes.tech AI
Odpoveď od AI
Generics v Jave umožňujú vytvárať triedy, rozhrania a metódy, ktoré pracujú s parametrizovanými typmi.
Hlavný účel Generics:
- Zvýšenie typovej bezpečnosti: Kompilátor kontroluje typy počas kompilácie, čím zabraňuje
ClassCastExceptionpočas behu. - Odstránenie potreby priameho prevodu typov: Nie je potrebné manuálne prevádzať typy pri získavaní prvkov z kolekcií.
- Vytváranie flexibilnejšieho a opakovane použiteľného kódu: Môžeme písať všeobecné algoritmy a dátové štruktúry použiteľné pre rôzne typy dát.
Príklad bez Generics:
// Pred Java 5
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // bez typovania
list.add("hello");
list.add(123); // môže pridať akýkoľvek objekt
String s = (String) list.get(0); // je potrebné prevádzať typ
Integer i = (Integer) list.get(1); // je potrebné prevádzať typ
// Možná chyba prevodu typu
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Príklad s Generics:
// S použitím Generics
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // zoznam reťazcov
list.add("hello");
// list.add(123); // chyba kompilácie - nie je možné pridať Integer
String s = list.get(0); // nie je potrebné prevádzať typ
// Nie je možné pridať iný typ, zabraňuje chybe
// List<Integer> intList = new ArrayList<>();
// intList.add("world"); // chyba kompilácie
System.out.println(s);
}
}
Generics sa tiež používajú v:
- Triedach:
ArrayList<E>,HashMap<K, V> - Rozhraniach:
List<E>,Map<K, V> - Metódach:
<T> void printArray(T[] array) - Obmedzeniach typov:
<T extends Comparable<T>>(obmedzenie na typy implementujúceComparable)
Implementácia Generics v Jave je založená na "stieraní typov" (type erasure) v štádiu kompilácie. To znamená, že informácie o generovaných typoch sa odstraňujú, a počas behu JVM pracuje so surovými typmi. To zabezpečuje spätnú kompatibilitu so staršími verziami Javy, ale má určité obmedzenia.