Дар истифодаи генератикҳо дар Java, калимаҳои калидии extends ва super чӣ фарқ доранд?
sobes.tech AI
Ҷавоб аз AI
Дар Java, вақте ки бо генераикҳо кор мекунед, калидвожаҳои extends ва super барои маҳдуд кардани намудҳо истифода мешаванд ва таъсир мерасонанд ба ковариантӣ ва контравариантӣ.
-
? extends T— маҳдудияти боло (ковариантӣ). Имкон медиҳад, ки намуд T ё ҳар як синфи зерини он истифода шавад. Ин маънои онро дорад, ки шумо метавонед объектҳои намуд T-ро аз ҷамъоварӣ хонед, аммо наметавонед бехатартарона объектҳоро ба чунин ҷамъоварӣ илова кунед (ғайр азnull). -
? super T— маҳдудияти поён (контравариантӣ). Имкон медиҳад, ки намуд T ё ҳар як синфи болоии он истифода шавад. Ин маънои онро дорад, ки шумо метавонед объектҳои намуд T-ро ба ҷамъоварӣ илова кунед, аммо ҳангоми хондан танҳо объектҳои намуд Object ё намудҳои умумии бештарро гирифтан мумкин аст.
Масалан:
List<? extends Number> listExtends = new ArrayList<Integer>();
Number num = listExtends.get(0); // Мебошад ҳамчун Number хонда шавад
// listExtends.add(10); // Хатои компилятсия
List<? super Integer> listSuper = new ArrayList<Number>();
listSuper.add(10); // Мебошад Integer илова кардан
Object obj = listSuper.get(0); // Вақте ки мехонем, намуд Object
Аз ин рӯ, extends вақте истифода мешавад, ки мехоҳед маълумотро аз сохтор хонед, ва super вақте, ки мехоҳед маълумот нависед.