将原始类型分配给泛型类型时,为什么不会出现编译器错误?

时间:2015-12-13 12:31:41

标签: java generics

我一直在关注OJCPA代码片段,我很困惑为什么编译器不会在以下代码中抛出错误。

List l = new ArrayList();
l.add("a");
l.add("b");
l.add(1);

List<String> strList = new ArrayList<>();
strList = l; //#1 - Why does the assignment compile?

for(String s: strList) {
      System.out.println(s); //#2 - It makes sense that it then throws a ClassCastException
}

我认为编译器会将List l视为原始类型,并且因为泛型是不变的,所以它会产生编译器错误,因为它不是List&lt;字符串&gt;。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:7)

允许向后兼容。

假设您正在调用返回List String的遗留方法,但它是在将泛型添加到Java之前编写的,因此它返回原始List。< / p>

您希望此行传递编译:

List<String> strList = someOldMethodThatReturnsRawList();

否则,您必须在新代码中继续使用原始List类型才能调用该方法。