Чем отличаются ключевые слова extends и super при использовании дженериков в Java?
Answer from AI
sobes.tech 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 — когда нужно записывать данные.