深度解读 Java 泛型:原理、好处与类型擦除

关于作者:毕业半年被裁,一个月斩获大厂offer,面试经验50+。“跟着周哥走,offer手里有”。文末免费领取周哥50+场面试总结出的必背面试题。

什么是泛型?
泛型就是将类型参数化,其在编译时才确定具体的参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
使用泛型的好处
1、类型安全泛型的主要目标是提高 Java 程序的类型安全。
编译时期就可以检查出因 Java 类型不正确导致的 ClassCastException 异常,符合越早出错代价越小原则。

2、消除强制类型转换
泛型的一个附带好处是,使用时直接得到目标类型,消除许多强制类型转换。所得即所需,这使得代码更加可读,并且减少了出错机会。
3、潜在的性能收益
由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。
泛型擦除

Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程被称为 泛型擦除。
泛型原理

泛型是一种语法糖,泛型这种语法糖的基本原理是类型擦除。Java中的泛型基本上都是在编译器这个层次来实现的,也就是说:泛型只存在于编译阶段,而不存在于运行阶段。在编译后的 class 文件中,是没有泛型这个概念的。
类型擦除:使用泛型的时候加上的类型参数,编译器在编译的时候会去掉类型参数。

java的泛型属于伪泛型,这是因为java在编译期间,所有的泛型信息都会被擦掉,在生成的字节码文件中,是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译时期去掉,这个过程称为类型擦除。

证明类型擦除:
在这里插入图片描述

比如说,我们定义一个两个ArrayList数组,泛型参数一个是String,一个是Integer.创建出两个对象后,一个引用是list1,一个引用是list2。list1和list2,添加元素时,分别只能添加String类型数据和Integer类型数据。
但是,我们分别用list1.getClass和list2.getClass,获取它们的类型信息,就会发现,二者是相同的。由此说明,泛型信息,在编译期间被擦除了,留下的类型就是ArrayList类型。

至于为什么类型擦除了,还能限制添加的数据类型。是因为,java编译器,在编译的时候,是先进性类型检查,在进行类型擦除的。类型检查针对的是引用变量,会对这个引用变量调用的add方法,进行检测,如此来限定传入的数据类型。这个类型检查不针对引用的对象。
比如在创建ArrayList对象时,泛型参数为String,这个String如果是加在引用变量左边的ArrayList类型上,那么使用add是只能添加字符串。那如果String作为泛型参数只加在new后面的构造器上,那么使用引用变量去调用add时,不光可以添加String类型数据,还可以添加比如Integer类型。

在这里插入图片描述
点击此处,获取面试秘籍

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值