擦除和翻译

先看下面的代码

public static String loophole(Integer x) {
    List<String> ys = new LinkedList<String>();
    List xs = ys;
    xs.add(x); 
    return ys.iterator().next();
}

public static void main(String[] args) {
    loophole(123);
}
image-20200213124451377.png

看到,程序类型的转换异常,但是编译器却没有报错

这样的原因是,泛型是通过 java 编译器的称为擦除(erasure)的前端处理来实现的。你可以(基本上就是)把它认为是一个从源码到源码的转换,它把泛型版本的 loophole()转换成非泛型版本。 结果是,java 虚拟机的类型安全和稳定性决不能冒险,即使在又unchecked warning 的情况下。

擦除去掉了所有的泛型类型信息。所有在尖括号之间的类型信息都被扔掉了,因此,比如说一个 List<String>类型被转换为 List。所有对类型变量的引用被替换成类型变量的上限(通常是 Object)

Java 的泛型支持仅在语法级别

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容