【发布时间】:2016-11-17 09:20:55
【问题描述】:
为什么这段代码会编译:
ArrayList strings = new ArrayList();
strings.add("s1");
strings.add("s2");
ArrayList<Integer> numbers = new ArrayList<Integer>(strings);
鉴于有问题的构造函数需要一个Collection<? extends E>,在这种情况下E 是整数?原始类型ArrayList 中的对象如何包含在E 的子类中?或者是否有一些隐藏的编译器魔法允许它用于遗留目的?
【问题讨论】:
-
我认为这是因为兼容性。由于编译器无法知道哪些对象在“字符串”中,它假定其中有正确的对象。如果编译器的行为不同(并且不允许这样做),那么从使用代码的(旧)非泛型到泛型的更改几乎是不可能的。
-
这只是众所周知的原始类型转换的一个实例:
List<Integer> numbers = new ArrayList();。
标签: java generics type-erasure raw-types