2
private void readList(ArrayList list){
    list.add("Hello");
    list.add(2);
}

public void run(){
    setFont("Courier-24");
    ArrayList<Integer> list = new ArrayList<Integer>();
    readList(list);
    println("list = "+list);
    println("Type of list[1] = "+list.get(1).getClass());

}

结果:
list = [Hello, 2]
Type of list[1]=class java.lang.Integer

public void run(){
    setFont("Courier-24");
    ArrayList<Integer> list = new ArrayList<Integer>();
    readList(list);
    println("list = "+list);
    println("Type of list[0] = "+list.get(0).getClass());

}


结果:
list = [Hello, 2]
线程“Thread-2”中的异常 java.lang.ClassCastException:
java.lang.String 无法转换为 java.lang.Integer

在阅读了一些关于的内容之后type erasure,我有了我的猜测:

当我调用 时readList(list),它实际上是将被“错误”视为类型的东西添加到列表中,ArrayList因此没有错误(这是我对所谓的理解type erasure)。但是,如果我调用println("Type of list = "+list.get(0).getClass());run()就会出现错误,因为list[0]它是 type String(而println("Type of list = "+list.get(1).getClass());不是因为 list[1] 是 type Integer)。

是不是像一个罪犯一开始从犯罪现场逃出来(因为他属于正常人,正常人有自由),后来当警察开始检查周围的每个人时,他就因为他是深渊的罪犯而被抓住了?

4

2 回答 2

1

type erasure遵循原则,您的方法应该看起来像

private void readList(ArrayList<Integer> list){
    list.add(1);
    list.add(2);
}

很明显,将字符串添加到整数数组不是一个好主意。

于 2015-05-28T01:37:01.780 回答
1

当你说

private void readList(ArrayList list){

这不是类型擦除。它是一个例子raw type。根据 Java 教程,

原始类型是没有任何类型参数的泛型类或接口的名称。

在泛型被添加到 Java 之前,只有原始类型

相反,类型擦除是一种优化。泛型是一种编译时类型检查功能,不会影响性能,因为泛型类型不是在运行时检查1 。

1在字节码中插入了类型转换。

于 2015-05-28T01:44:31.213 回答