Sobes.tech
Junior — Middle

Puoi spiegare il concetto di ereditarietà nell'uso dei generici?

sobes.tech AI

Risposta dell'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, а не через прямое наследование параметризованных типов.