Назад к вопросам
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