[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泛型就是编译后都会被擦除了,泛型只是在编译前规范和验证的