这是一个代码片段:
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 发生呢?
最佳答案
#3 有效,因为 get(int)
返回的对象被忽略。存储在 0
位置的任何内容都会返回,但由于没有强制转换,因此不会发生错误。
#4 出于同样的原因可以正常工作:get(0)
生成的对象被视为 println< 中的
,因为 java.lang.Object
子类toString
被调用。由于 toString()
可用于所有 Java 对象,因此调用完成时不会出错。
关于java - 为什么可以从 Java 中的参数化列表中取回 "incorrect-type"的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28859646/