类型擦除和我的理解的一个例子

时间:2015-05-28 00:39:39

标签: java types erasure

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 = [你好,2]
    列表类型[1] =类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 = [你好,2]
    线程中的异常&#34;线程-2&#34; java.lang.ClassCastException:
    java.lang.String无法强制转换为java.lang.Integer

在阅读了type erasure的内容之后,我得到了猜测:

当我致电readList(list)时,它实际上会将内容添加到列表中,这是错误的&#39;被视为类型ArrayList所以没有错误(这是我对所谓的type erasure的理解)。但是,如果我在println("Type of list = "+list.get(0).getClass());中拨打run(),则会出现错误,因为list[0]的类型为String(而println("Type of list = "+list.get(1).getClass());并不是因为列表[1]属于Integer)类型。

是不是有些犯罪分子最初逃离犯罪现场(因为他属于正常人,而正常人有自由),后来当警察开始检查周围的人时,他被抓住了,因为他是一个深陷罪犯?

2 个答案:

答案 0 :(得分:1)

按照type erasure原则,您的方法应该是

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

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

答案 1 :(得分:1)

当你说

private void readList(ArrayList list){

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

  

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

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

对比type-erasure是一种优化。泛型是编译时类型检查功能,没有性能影响,因为在运行时检查泛型类型 1

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