DIY主题讨论6:泛型

【DIY主题讨论6:泛型】

1. Java如果没有泛型会有什么灾难?

泛型是参数化类型,在使用时告诉编辑器使用什么类型。

  1. 程序可控性:泛型有限定类型,泛型可以使程序执行时的类型是确定的,避免了程序的不可控性。在泛型引入之前,对于不确定类型需要使用Object,然后类型强转,此处带来的问题,Object含义不清,使代码不易懂,同时类型无界限限定,很可能会想当然使用错误类型。泛型的引入,在开发是对类或者方法的范围做一个限定,使类和方法运行在有限的类型中,使程序更清晰,可控性更强
    Alt text

上图是ArrayList的add操作,jdk1.5前参数为Object,也就意味着任何类型都可以放入list中。

  1. 提升复用性:解耦类或方法对类型之间的约束,通过参数化类型,使执行相同功能的方法、类能够复用代码,如果没有泛型,相同的代码每个类都要写一份,带来了大量冗余代码。一个场景,CRUD在web项目广泛使用,逻辑类似,每个类型写一遍crud方法就会造成很多冗余代码,这时可以封装一个泛型基类,一份代码给所有类型用。
  2. 使用泛型,编译时就能确保容器中插入对象的类型安全,编译器发现问题要好于运行时发现问题,运行时出问题很有可能就意味着生产事故了。我们应该避免产生隐藏较深的bug,让bug越早暴露越好。

2. List<? extends T>和List<? super T>有哪些区别?

  1. List<? extends T>,Get Frist适用于消费集合为主的场景,List<? extends T>可以赋值给任何T及T子类的场景,上界为T,put受限,add只能放入null,不能放入其他元素;使用List<? extends T>相当于一个视图,不具有修改能力,但被赋值的原集合修改,视图可以感知。
  2. List<? super T>,Put Frist适用于生产集合为主的场景,List<? super T>可以赋值给任何T及T的父类集合,下界为T,put可以放入T及T的父类类型,get受限,get可以使用,但是类型会被擦除到Object。
  3. 不同点维度:赋值,put、get
  4. List<? extends T>类比于数据库的视图,T决定了结果集列的属性,相同与视图的List<? extends T>也是主要用于展示,如果要添加或者删除记录,则应修改原先的list。

3. 类名<? super T>存在哪些实际应用场景?(参考Comparator)

Comparator<? super T> 准许为所有的子类使用相同的比较器。通常我们会使用Comparator自己定义对象的比较规则,如果要比较猫的重量,那么就实现猫重量的比较器,比较狗的重量,则需要实现狗重量的比较器,但如果要允许将猫与狗的重量进行比较,则就需要Comparator<? super T>来发挥作用,定义animal的比较器,就可以比较猫和狗的重量。<? super T>使的方法可以使方法不仅可以作用于父类也可以作用于子类,增加了代码的复用性。

补充

泛型会擦除传入实体的属性,如果使用< T >,则T的类型在代码执行时会被擦除,因为Object是所有类的父类,所以此时T只具有Object的属性,但是当使用< ? super T>或<? extends T> ,定义边界,T的类型会被保留到边界T。

泛型在Java1.5引入,在泛型引入前java语言已经有了广泛的发展,较好的生态,拥有大量的类库,因此java在引入泛型的同时,也考虑到了兼容过去代码(java升级良好的兼容性我想是java能够经久不衰的重要原因)。java的泛型是具有类型擦除特性的
泛型具有类型推断能力,但是类型推断仅在赋值时有效。如果将泛型方法返回结果作为参数,这时并不会执行类型推断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值