泛型的上下限怎么理解

334 阅读2分钟

这是我参与更文挑战的第13天,活动详情查看: 更文挑战

今天 4ye 来和小伙伴们分享下 泛型的上下限

博主经常混淆了泛型的上限和下限的使用。。🐖,正巧在阿里巴巴的java开发手册——《Java开发手册(嵩山版)》中看到有关泛型的这个知识点👍,写写笔记,希望不要再忘啦😄

如下图:

20201012231256

概念:PECS(Producer Extends Consumer Super) 😐

实体类

public class Fruit {
}
class Apple extends Fruit{}
class Pear extends Fruit{}
class Orange extends Fruit{}

泛型的上限

如下图,可以看到这里是不允许再添加任何实例的,只能从该list中去获取实例。

20201012082704

为什么不能添加呢?🐖

因为这个list 可能有以下几个情况

  1. list是Fruit类型的,此时你去添加Fruit的子类都没问题

  2. list是Apple类型的,此时你只能添加Apple,同理Pear,Orange也是。🙃

根本不晓得传进来的参数list会是哪种类型,当然不能随意添加啦, 如果list是Apple类型的,那就不能添加除Apple之外的,那如果是Pear呢,也一样,所以就全都不能添加啦。

为什么可以取出呢?🐖

因为我们从list中拿出来的必定是Fruit类型的,毕竟Apple等都去继承Fruit了,可以自动向上转型

泛型的下限

如图,下限和上限相反,上限get,下限add

可以看到下图get拿到的都是object类型,没有意义🐖

20201012082940

为什么super可以添加呢?🐖

这里定义了下限是Fruit,也就是说这个list里面的类型都是Fruit的父类,所以我们只能添加Fruit和他的子类。

为什么不可以取出呢?🐖

因为取的时候没法确实是Fruit的哪个父类,最后都只能获取我们的根类Object

小结

泛型的上限<? extends T>用在频繁获取数据的场景, 泛型的下限<? super T>用在频繁添加数据的场景

最后

欢迎小伙伴们来一起探讨问题~

如果你觉得本篇文章还不错的话,那拜托再点点赞支持一下呀😝

让我们开始这一场意外的相遇吧!~

欢迎留言!谢谢支持!ヾ(≧▽≦*)o 冲冲冲!!

我是4ye 咱们下期很快再见!!