这是一个代码片段:
import java.util.*;
class Test
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<>();
addToList(list);
Integer i = list.get(0); //#1 fails at run-time
String s = list.get(0); //#2 fails at compile-time
list.get(0); //#3 works fine
System.out.println(list.get(0)); //#4 works fine, prints "string"
}
static void addToList(List list){
list.add("string");
}
}
我明白为什么可以在参数化列表中插入 String 类的对象。
似乎我理解为什么标记为#1
和#2
失败的代码。
但为什么要做#3
和#4
工作?据我了解,编译器在类型擦除后添加了适当的强制转换,因此当我调用 时list.get(0)
,此方法应返回先前强制转换为 Integer 的 Object。那么为什么在运行时 #3 和 #4 没有发生 ClassCastException 呢?