Sobes.tech
Назад к вопросам
Junior — Middle
67

Чем обусловлено невозможность присваивания коллекции объектов типа Integer переменной типа Number в языке программирования?

Ответ от нейросети

sobes.tech AI

В Java коллекции параметризуются с помощью дженериков, которые являются инвариантными. Это означает, что коллекция типа Collection<Integer> не является подтипом Collection<Number>, даже несмотря на то, что Integer наследуется от Number.

Причина в том, что если бы такое присваивание было разрешено, это могло бы привести к ошибкам времени выполнения. Например, если бы Collection<Integer> можно было присвоить переменной типа Collection<Number>, то в эту коллекцию можно было бы добавить объект Double, что нарушило бы типизацию.

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

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

Пример:

Collection<Integer> integers = new ArrayList<>();
Collection<? extends Number> numbers = integers; // допустимо
// numbers.add(3.14); // ошибка компиляции
Number n = numbers.iterator().next(); // можно читать как Number