JAVA类型擦除

类型擦除

  • 泛型是 Java 1.5 版本才引进的概念,在这之前是没有泛型的概念的,但显然,泛型代码能够很好地和之前版本的代码很好地兼容。这是因为,泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。通俗地讲,泛型类和普通类在 java 虚拟机内是没有什么特别的地方。回顾文章开始时的那段代码
List<String> l1 = new ArrayList<String>();
List<Integer> l2 = new ArrayList<Integer>();        
System.out.println(l1.getClass() == l2.getClass());
  • 打印的结果为 true 是因为 List<String>和 List<Integer>在 jvm 中的 Class 都是 List.class。泛型信息被擦除了。泛型类被类型擦除后,相应的类型就被替换成 Object 类型
    在泛型类被类型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,如 <T>则会被转译成普通的 Object 类型,如果指定了上限如 <T extends String>则类型参数就被替换成类型上限。
public class Erasure <T extends String>{
//  public class Erasure <T>{
    T object;

    public Erasure(T object) {
        this.object = object;
    }
    
}
  public static void main(String[] args) {
       Erasure<String> str = new Erasure<String>();
       System.out.println(l1.getClass() == l2.getClass());     
  }
  • 此时打印结果为Erasure.class
  • 在泛型类被类型擦除的时候,之前泛型类中的类型参数部分如果没有指定上限,如 <T>则会被转译成普通的 Object 类型,如果指定了上限如 <T extends String>则类型参数就被替换成类型上限。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为...
    编程小世界阅读 3,030评论 0 0
  • 本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。 1. 什么是类型擦除 为...
    编程小世界阅读 3,873评论 0 0
  • 更多 Java 高级知识方面的文章,请参见文集《Java 高级知识》 类型系统 Liskov 里氏替换原则,子类可...
    专职跑龙套阅读 10,499评论 0 6
  • 泛型,一个孤独的守门者。 大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛...
    程序员BUG阅读 2,806评论 0 0
  • 泛型,一个孤独的守门者。 大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛...
    传奇内服号阅读 3,068评论 0 0