Middle
Mi a Generics és mire használják őket?
sobes.tech MI
Válasz az MI-től
A Java generikus lehetővé teszi osztályok, interfészek és módszerek létrehozását, amelyek paraméterezett típusokkal működnek.
A generikusok fő célja:
- A típusbiztonság növelése: A fordító ellenőrzi a típusokat a fordítási szakaszban, megelőzve a
ClassCastException-t futás közben. - Típuskonverziók kiküszöbölése: Nincs szükség manuális típuskonverziókra az elemek kinyerésekor a gyűjteményekből.
- Rugalmasabb és újrahasznosítható kód létrehozása: Általános algoritmusokat és adatszerkezeteket írhatunk, amelyek különböző adattípusokra alkalmazhatók.
Példa generikusok nélkül:
// Java 5 előtt
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // típus nélkül
list.add("szia");
list.add(123); // bármilyen objektum hozzáadható
String s = (String) list.get(0); // típuskonverzió szükséges
Integer i = (Integer) list.get(1); // típuskonverzió szükséges
// Lehetséges típuskonverziós hiba
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Példa generikusokkal:
// Generikusokkal
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // szöveges lista
list.add("szia");
// list.add(123); // fordítási hiba - nem adhatunk hozzá Integer-t
String s = list.get(0); // típuskonverzió nélkül
// Nem lehet más típus hozzáadása, megelőzi a hibákat
// List<Integer> intList = new ArrayList<>();
// intList.add("világ"); // fordítási hiba
System.out.println(s);
}
}
A generikusokat a következő területeken is használják:
- Osztályok:
ArrayList<E>,HashMap<K, V> - Interfészek:
List<E>,Map<K, V> - Metódusok:
<T> void printArray(T[] array) - Típuskorlátozások:
<T extends Comparable<T>>(korlátozás azokra a típusokra, amelyekComparable-t valósítanak meg)
A Java generikusok implementációja a "típus elmosódás" (type erasure) elvre épül, amely a fordítási időben történik. Ez azt jelenti, hogy a generikus típusokra vonatkozó információk eltávolításra kerülnek, és futásidőben a JVM nyers típusokkal dolgozik. Ez biztosítja a régebbi Java-verziókkal való kompatibilitást, de bizonyos korlátozásokkal jár.