Sobes.tech
Junior — Middle

Каква е разликата между ключовите думи extends и super при използване на дженерик в Java?

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 — когато трябва да записвате данни.