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 anull-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.