Почему этот код компиляции:Почему ArrayList <E> конструктор позволяет необработанного параметр ArrayList
ArrayList strings = new ArrayList();
strings.add("s1");
strings.add("s2");
ArrayList<Integer> numbers = new ArrayList<Integer>(strings);
Учитывая, что конструктор в вопросе ожидает Collection<? extends E>
где E
в данном случае Integer? Как объекты, содержащиеся в необработанном типе ArrayList
, являются подклассом E
? Или есть какая-то скрытая магия компилятора, которая позволяет это для устаревших целей?
Я думаю, что это из-за совместимости. Поскольку компилятор не может знать, какие объекты находятся в «строках», он предполагает, что в нем есть правильные. Если компилятор вел себя по-другому (и не допустил бы этого), переход от (старых) не общих правил с использованием кода к дженерикам был бы почти невозможным. –
Это всего лишь один экземпляр известного преобразования исходного типа: 'Список numbers = new ArrayList();'. –