一个关于类型转换非常奇怪的问题

[code="java"]public class MainTest {

public static void main(String[] args){

    List<Integer> a = (List<Integer>)func();
    System.out.println(a);

}

public static List func(){
    List<String> ret = new ArrayList<String>();
    ret.add("hello");
    return ret;
}

}[/code]

最后竟然能输出[hello]
为什么不会提示报错呢?是不是如上的类型转换只会检查最外层的类型List?

[code="java"]
public static void main(String[] args)
{
List a = func();
System.out.println(a);
}

public static List func()
{
List ret = new ArrayList();
ret.add("hello");
return ret;
}
[/code]
用编译工具查看生成的.class文件,还原成这样的代码!

另外java的泛型是编译时检查而已。你可以尝试
System.out.println((Integer)a.get(0)); ClassCastException就会出现了。

System.out.println((String)a.get(0));编译器会报错,不允许的。

为啥要报错呢。问题在于你强转之后啥也没做就打印一下list。
如果有数据的读取或者添加操作就会出错了。。
然后打印么,就直接call list的 toString method了。
list的toString method 应该是没有泛型安全的。

java泛型就是编译后都会被擦除了,泛型只是在编译前规范和验证的