泛型的上下限怎么理解

简介: 实体类public class Fruit {}class Apple extends Fruit{}class Pear extends Fruit{}class Orange extends Fruit{}复制代码泛型的上限如下图,可以看到这里是不允许再添加任何实例的,只能从该list中去获取实例。为什么不能添加呢?🐖因为这个list 可能有以下几个情况list是Fruit类型的,此时你去添加Fruit的子类都没问题list是Apple类型的,此时你只能添加Apple,同理Pear,Orange也是。🙃根本不晓得传进来的参数list会是哪种类型

实体类


public class Fruit {
}
class Apple extends Fruit{}
class Pear extends Fruit{}
class Orange extends Fruit{}
复制代码


泛型的上限


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


网络异常,图片无法展示
|


为什么不能添加呢?🐖


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


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


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


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


为什么可以取出呢?🐖


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


泛型的下限


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


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


网络异常,图片无法展示
|


为什么super可以添加呢?🐖


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


为什么不可以取出呢?🐖


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


小结


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



目录
相关文章
|
7月前
|
安全 Java API
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
71 3
|
7月前
|
C++
关系运算符及其优先次序:编程中的比较逻辑
在编程中,关系运算符是用于比较两个值之间关系的一种重要工具。它们帮助我们根据这些关系(如相等、不等、大于、小于等)来做出决策或执行特定的代码块。理解关系运算符及其优先次序对于编写正确和高效的代码至关重要。
152 0
|
Java Spring
常量or枚举的取舍
常量or枚举的取舍
50 0
|
编译器 C++
c++中基本类型详细解释外加基本运算规则
类型 含义 wchat_t 宽字符 bool 布尔类型 char 字符 chat16_t unicode字符 chat_32 unicode字符 short 短整型 int 整形 long 长整型 longlong 长整型 float 单精度浮点型 double 双精度浮点型 longdouble 扩展精度浮点型
123 1
|
Java C语言
函数实参与形参的区别
函数实参与形参的区别
204 0
函数实参与形参的区别
灵活运用递增递减
灵活运用递增递减
71 0
|
存储 Java
Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归
Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归
128 0
|
Java 开发者
泛型(泛型问题引出)|学习笔记
快速学习 泛型(泛型问题引出)
|
安全 编译器 C#
多用as少用强制类型转换
多用as少用强制类型转换
124 0
Java语法糖--个数可变的形参
本文目录 1. 背景 2. 优点 3. 注意事项 3.1 位置只能在方法的最后 3.2 个数可变形参本质是数组,所以不能算重载
144 0