Mi az a PECS elv és hogyan alkalmazzák Java-ban?
sobes.tech MI
Válasz az MI-től
A PECS (Producer Extends Consumer Super) elv az emlékezetes szabály arra, hogy meghatározza, mikor kell a extends és super kulcsszavakat használni a Java generikusok wildcard típusainál.
-
Producer (Gyártó): Ha egy generikus paramétert arra használsz, hogy adatokat szerezzen (elemeket vonjon ki egy gyűjteményből), akkor használj wildcard-ot
extends-szel. A gyűjtemény adatgyártóként működik. A? extends Ttípus azt jelenti, hogy "bármilyen típus, amiTvagy annak alosztálya". Biztonságosan olvashatsz elemeketTtípusban (vagy annak szuperosztályában), de nem adhatsz hozzá elemeket ilyen gyűjteményhez (kivéve anull-t). -
Consumer (Fogyasztó): Ha egy generikus paramétert arra használsz, hogy adatokat adjon hozzá (elemeket tegyen egy gyűjteménybe), akkor használj wildcard-ot
super-rel. A gyűjtemény adatfogyasztóként működik. A? super Ttípus azt jelenti, hogy "bármilyen típus, amiTvagy annak szuperosztálya". Biztonságosan hozzáadhatszTtípusú (vagy alosztályú) elemeket, de olvasáskorObject-ként kapod őket.
Java-ban való alkalmazás:
Wildcard típusokkal (?) használva növeli az API-k rugalmasságát, amelyek gyűjteményekkel vagy más generikus típusokkal dolgoznak, lehetővé téve számukra, hogy szélesebb típusskálával működjenek, miközben megőrzik a típusbiztonságot.
Példák:
// Producer példa
// A printAll metódus List-ből olvas
public void printAll(List<? extends Number> list) {
// Elemeket Number-ként (vagy Object-ként) olvashatunk
for (Number num : list) {
System.out.println(num);
}
// Nem adhatunk hozzá elemeket (kivéve null)
// list.add(123); // Fordítási hiba
}
// Consumer példa
// Az addNumbers metódus List-be ad hozzá
public void addNumbers(List<? super Integer> list) {
// Integer vagy alosztályai hozzáadhatók
list.add(1);
list.add(new Integer(2));
// list.add(new Double(3.0)); // Fordítási hiba
// Olvasáskor Object-et kapunk
Object o = list.get(0);
}