Sobes.tech
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, amelyek Comparable-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.