为什么这个代码编译:为什么ArrayList的<E>构造允许原始的ArrayList参数
ArrayList strings = new ArrayList();
strings.add("s1");
strings.add("s2");
ArrayList<Integer> numbers = new ArrayList<Integer>(strings);
鉴于所涉及的构造函数需要一个Collection<? extends E>
其中E
在这种情况下是整型?如何将原始类型ArrayList
中的对象包含在E
的子类中?或者是否有一些隐藏的编译器魔术可以实现这一目的?
我想这是因为兼容性。由于编译器无法知道哪些对象在“字符串”中,因此它假定其中存在正确的对象。 如果编译器的行为不同(并且不允许这样做),那么从(旧)非泛型使用代码到泛型的改变几乎是不可能的。 –
这只是众所周知的原始类型转换的一个实例:'列表 numbers = new ArrayList();'。 –