Middle
Aké sú možnosti v Generics?
sobes.tech AI
Odpoveď od AI
Generik umožňujú vytvárať parametrizované triedy, rozhrania a metódy.
Hlavné možnosti:
- Znovupoužiteľnosť kódu: Vytváranie univerzálnych štruktúr dát a algoritmov, ktoré fungujú s akýmikoľvek typmi.
- Bezpečnosť typov počas kompilácie: Chyby typov sa odhaľujú v štádiu kompilácie, nie počas behu. Odstraňuje potrebu manuálneho prevodu typov a súvisiacich potenciálnych chýb
ClassCastException. - Vylepšená čitateľnosť: Kód je jasnejší, pretože výslovne ukazuje, s akými typmi pracuje.
Príklady:
- Trieda-kontejner
List<T>môže ukladať prvky akéhokoľvek typuT. - Metóda
static <T> T getFirst(List<T> list)môže vracať prvý prvok zo zoznamu akéhokoľvek typu.
Obmedzenia Generics:
- Nie je možné vytvárať inštancie generického typu:
new T(). - Nie je možné používať primitívne typy ako parametre typu (napríklad
List<int>- nesprávne, je potrebnéList<Integer>). - Nie je možné priamo vytvárať polia generických typov (napríklad
T[] array = new T[10]- nesprávne, je potrebné použiťArrayListalebo konverziu typov). - Nie je možné používať statické polia generického typu priamo.
- Informácie o typoch sa strácajú počas behu (Type Erasure), okrem bounded wildcards.
Wildcards a Bounded Type Parameters:
<?>: Neznámy typ. Umožňuje čítať prvky, ale nie písať.<? extends T>: Horné obmedzenie. Umožňuje pracovať s typmi, ktoré sú podtypmiT. Môže čítať prvky typuTalebo jeho supertypov, ale nie písať (okremnull).<? super T>: Dolné obmedzenie. Umožňuje pracovať s typmi, ktoré sú supertypmiT. Môže písať prvky typuTalebo jeho podtypov, ale čítať len prvky typuObject. Príklad:
// Metóda, ktorá môže vypísať prvky z ľubovoľného zoznamu,
// ktorý obsahuje podtypy Number
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(new Integer(1)); // Chyba kompilácie
}
// Metóda, ktorá môže pridávať Integer do zoznamu,
// ktorý obsahuje Integer alebo jeho supertypy
public static void addIntegers(List<? super Integer> list) {
list.add(new Integer(10));
// Integer val = list.get(0); // Chyba kompilácie, vracia Object
}