java泛型为伪泛型,什么,JAVA的泛型是伪泛型

泛型是JDK 1.5的一项新增特性,它的本质是参数化类型(ParametersizedType)的应用,也就是说所操作的数据类型被指定为一个参数(是不是像lambda表达式差不多的用义,用函数作为一个方法的参数)。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。

具体来说,我们先通过对比下代码,来进一步体会泛型的好处

先看看没有支持泛型之前的代码

cb1668f6cc1349a15541a86c26d5c288.png没有运用泛型的代码

129a2878e74e15bae99801596d578a9a.png运用泛型的代码示范

由以上两个例子可以看出:

引入泛型后,代码在前端编译的时候会做检查,不会像1.5的代码示范一样,直到程序运行期才提示异常。通过现代idea自动编译功能,由此可以大大提高我们的编程效率

但是有关java的泛型有一些值得思考的问题:

afd8f3a7a8fb0d1c223db5f37f5f3fab.png方法重载

2d14e2630752fd7070d00acc915d0849.png编译异常

代码示范:用两个不同List类型参数重载getName方法编译报错,why?

以上现象是因为在编译时泛型擦除造成的,什么? 泛型擦除又是什么鬼?

我们可以通过字节码来分析这个问题

adc6d52e0c45161ca987e918b94ca114.png代码示范

9d7da3c64e8c30ba85b4d41cd4968773.png字节码片段

然后用jd-gui工具反编译回java代码

a31ace53701858b732f9f20228558294.png反编译后的代码

通过对比可以看出,反编译的代码跟我们之前写的代码不一致了,代码风格也用回1.5之前的强制类型转换了,即高版本支持某些语法糖的编程风格编译之后转化为低版本代码风格了(解语法糖)

现在我们可以知道为什么用两个不同List类型参数重载getName方法会编译报错了:

两个不同List类型参数,在编译的时候都转为List了,然后就不符合重载的定义了

所以有个哲学上的问题:

List

List

其实这两个类型不是真正意义上的类型,他们在某种意义上还是一个List类型,只是套了层修饰,这种表面上的修饰作用很有利于编程人员,过了编译期,这种修饰就没有意义了,当然,为了运行期反射来获取这种修饰符号,在编译成字节码时,增加了一些属性来记录这个具体的类型,解决伴随泛型而来的参数类型的识别问题,如如Signature、LocalVariableTypeTable

a20effdf817f3ac1662e85d976331487.pngSignature和LocalVar

所以有个说法是:java实现的泛型,其实不是真正意义上的泛型,是伪泛型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值