泛型也分真假?军哥带你火眼金睛看穿它

大家好,这里是五彩石编程,我是军哥。在编程的世界里,经常会听到一个词叫做“泛型”,很多人对它还不是很了解,更不知道泛型也是分真假的,今天军哥就带着大家练就一双火眼金睛,轻松看透掌握它。


泛型及其应用场景

泛型这个名字取得很传神,“泛”,广泛,“型”,类型,合在一起就是能够包含很广泛,也即很多种类型的意思。对于强类型的语言来说,如果一个方法或类能够处理很多种类型,那么写代码就省事多了,要不然还需要根据每一种类型写一个方法或类,那就太麻烦了,举个例子。

比如最常见的ArrayList,我们可能向列表中存入数字,也可能存入字符串,或者某种对象,由于java的类型约束,如果不使用泛型,你就需要定义多个类型的ArrayList,并且每新增一个类,就可能需要同步定义一个ArrayList,同时,常用的HashMap是不是也需要这样处理,如果都这样的话,那代码就太难维护了。但如果使用泛型,那么就只需要写一个支持泛型的ArrayList就可以满足所有使用这种列表的地方了,是不是就方便了很多?这就是泛型的典型应用场景。

辨别泛型真假

我们知道,对于编译型的语言,其源码需要编译之后才能运行,那么,如果一种泛型技术,使得某种类型在源码中存在,在编译之后也存在,那么这种泛型技术,就叫做“真实泛型”,如果一种泛型技术,使得某种类型只在源码中存在,在编译之后类型就没有了,那么这种泛型技术,就叫做“伪泛型”。

对于C#来说,我们在代码中写的List<int>List<String>在源码中会存在,在编译之后依然存在,还是两种不同的类型,它的泛型就是真正的泛型,使用的技术叫做 类型膨胀

对于java来说,我们在代码中写的List<Integer>List<String>只会在源码中存在,编译之后就没有了,这种泛型就是 伪泛型。同时,为了保证类型是正确的,java在编译后,在需要使用类型的地方,又插入了强制类型转换的代码,所以它的泛型技术,本质上是java提供的一颗语法糖,其实现技术被称之为 类型擦除

类型擦除真的擦了吗?

虽然叫做类型擦除,但java并不是真的就把类型的所有信息全部都擦除掉了,而只是去了除代码中属性相关的字节码中的类型,对于元数据中的类型,还是保留了,写一个使用泛型的类或方法,再察看编译生成的class文件中的内容,也可以看出来这一点,虽然在赋值等操作时都是Object,但在取出使用时,编译器都会添加一条checkcast指令,指令的参数就是要强制转换为的目标类型。这样就可以既不影响类型的正常使用,又可以在使用反射时,把类型的信息给准确的还原出来了,可谓是两全其美。


相信现在,你已经对泛型的真假有了清晰的认知了吧!想了解更多的java技术,请微信搜索并关注 “五彩石编程”公众号,军哥的文章将会持续同步更新。


下课

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值