Sobes.tech
Junior — Middle

Mi a különbség az extends és super kulcsszavak között a Java generikusok használatakor?

sobes.tech MI

Válasz az MI-től

Java-ban, amikor generikusokkal dolgozik, az extends és a super kulcsszavakat a típusok korlátozására használják, és befolyásolják a kovarianciát és a kontravarianciát.

  • ? extends T — felső korlátozás (kovariancia). Lehetővé teszi a T típus vagy bármely alosztályának használatát. Ez azt jelenti, hogy a gyűjteményből T típusú objektumokat olvashatunk, de nem lehet biztonságosan objektumokat hozzáadni (kivéve a null-t).

  • ? super T — alsó korlátozás (kontravariancia). Lehetővé teszi a T típus vagy bármely szuperosztályának használatát. Ez azt jelenti, hogy T típusú objektumokat adhatunk hozzá a gyűjteményhez, de olvasáskor csak Object vagy általánosabb típusú objektumokat kaphatunk.

Példa:

List<? extends Number> listExtends = new ArrayList<Integer>();
Number num = listExtends.get(0); // Numberként olvasható
// listExtends.add(10); // Fordítási hiba

List<? super Integer> listSuper = new ArrayList<Number>();
listSuper.add(10); // Integer hozzáadása lehetséges
Object obj = listSuper.get(0); // Olvasáskor az típus Object

Ezért az extends akkor használandó, amikor adatokat kell olvasni a struktúrából, a super pedig, amikor adatokat kell írni.