Junior — Middle
Nima uchun dasturlash tilida Integer turidagi ob'ektlar to'plamini Number turidagi o'zgaruvchiga tayin qilish mumkin emas?
sobes.tech AI
AIdan javob
В 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