Sobes.tech
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 ClassCastException hibá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ármilyen T tí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, helyette List<Integer> kell).
  • Nem lehet közvetlenül generikus típusú tömböket létrehozni (pl. T[] array = new T[10] - helytelen, ArrayList vagy 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, amelyek T al-típusai. Olvashat T típusú vagy szuper-típusú elemeket, de írni nem lehet (kivéve null).
  • <? super T>: Alsó határ. Olyan típusokkal dolgozik, amelyek T szuper-típusai. Írhat T típusú vagy al-típusú elemeket, olvasáskor csak Object-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
}