在Java中,从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,而第一行却没有?
void a(Object o) { Integer i = (Integer) o; List<Integer> list = (List<Integer>) o; } /*Type safety: Unchecked cast from Object to List<Integer>*/
这是因为在执行时,由于 类型Erase 不会 真正 检查对象是否为a 。真的只是将其投射到。例如:List<Integer> __List
List<Integer>
List
List<String> strings = new ArrayList<String>(); strings.add("x"); Object o = strings; // Warning, but will succeeed at execution time List<Integer> integers = (List<Integer>) o; Integer i = integers.get(0); // Bang!
有关更多信息,请参见Angelika Langer的Java泛型常见问题解答,尤其是类型擦除部分。