Sobes.tech
Junior — Middle

Дар истифодаи генератикҳо дар 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 вақте, ки мехоҳед маълумот нависед.