Sobes.tech
Back to questions
Junior — Middle
60

Можете объяснить концепцию наследования при использовании дженериков?

Answer from AI

sobes.tech AI

В Java дженерики не поддерживают наследование типов напрямую, то есть, например, List<Dog> не является подклассом List<Animal), даже если Dog наследует Animal. Это связано с тем, что дженерики инвариантны по умолчанию.

Для решения этой проблемы используются ковариантные и контравариантные ограничения с помощью wildcard:

  • List<? extends Animal> — ковариантный тип, позволяет читать элементы как Animal, но запрещает добавлять новые элементы.
  • List<? super Dog> — контравариантный тип, позволяет добавлять объекты Dog и его подклассов, но чтение возвращает Object.

Пример:

class Animal {}
class Dog extends Animal {}

List<Dog> dogs = new ArrayList<>();
List<? extends Animal> animals = dogs; // можно читать как Animal

Animal a = animals.get(0); // OK
// animals.add(new Dog()); // Ошибка компиляции

Таким образом, наследование при дженериках контролируется через wildcard, а не через прямое наследование параметризованных типов.