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
)类型。
是不是有些犯罪分子最初逃离犯罪现场(因为他属于正常人,而正常人有自由),后来当警察开始检查周围的人时,他被抓住了,因为他是一个深陷罪犯?
答案 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 字节代码中插入了类型转换。