Middle
Milyen lehetőségek vannak a Generics-ben?
sobes.tech MI
Válasz az MI-től
A Generics lehetővé teszik paraméterezett osztályok, interfészek és metódusok létrehozását.
Fő funkciók:
- Kód újrahasznosítása: Általános adatszerkezetek és algoritmusok létrehozása, amelyek bármilyen típusú adatokkal működnek.
- Típusbiztonság fordítási időben: A típushibák a fordítási időben kerülnek felismerésre, nem futás közben. Ez kiküszöböli a manuális típuskonverziók szükségességét és a potenciális
ClassCastExceptionhibákat. - Olvashatóság javítása: A kód világosabban mutatja, hogy milyen típusokkal dolgozik.
Példák:
- A
List<T>konténerosztály bármilyenTtípusú elemet tárolhat. - A
static <T> T getFirst(List<T> list)metódus bármilyen típusú lista első elemét visszaadhatja.
Generics korlátai:
- Nem lehet példányokat létrehozni általános típusokból:
new T(). - Nem lehet primitív típusokat típusparaméterként használni (pl.
List<int>- helytelen, helyetteList<Integer>kell). - Nem lehet közvetlenül generikus típusú tömböket létrehozni (pl.
T[] array = new T[10]- helytelen,ArrayListvagy típuskonverzió szükséges). - Nem lehet statikus mezőket közvetlenül generikus típusokkal használni.
- A típusinformációk futás közben törlődnek (Type Erasure), kivéve a határolt wildcards-okat.
Wildcards és határolt típusparaméterek:
<?>: Ismeretlen típus. Olvasásra engedélyezett, írás nem.<? extends T>: Felső határ. Olyan típusokkal dolgozik, amelyekTal-típusai. OlvashatTtípusú vagy szuper-típusú elemeket, de írni nem lehet (kivévenull).<? super T>: Alsó határ. Olyan típusokkal dolgozik, amelyekTszuper-típusai. ÍrhatTtípusú vagy al-típusú elemeket, olvasáskor csakObject-ként érhető el.
Példa:
// Olyan metódus, amely bármilyen `Number` al-típusokat tartalmazó listából képes kiírni az elemeket
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(new Integer(1)); // Fordítási hiba
}
// Olyan metódus, amely Integer-t adhat hozzá egy listához
public static void addIntegers(List<? super Integer> list) {
list.add(new Integer(10));
// Integer val = list.get(0); // Fordítási hiba, Object-et ad vissza
}