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

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;
}
}

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

小怪兽爱吃肉
浏览 441回答 3
3回答

慕森王

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;}用编译工具查看生成的.class文件,还原成这样的代码!另外java的泛型是编译时检查而已。你可以尝试System.out.println((Integer)a.get(0)); ClassCastException就会出现了。System.out.println((String)a.get(0));编译器会报错,不允许的。

慕村9548890

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

拉风的咖菲猫

java泛型就是编译后都会被擦除了,泛型只是在编译前规范和验证的
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java