泛型的上下限怎么理解

简介: 实体类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>用在频繁添加数据的场景



目录
相关文章
|
4月前
|
安全 Java API
Java一分钟之-泛型通配符:上限与下限野蛮类型
【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。
52 3
|
4月前
|
算法 编译器 C++
【C++ 模板编程 基础知识】C++ 模板类部分特例化的参数顺序
【C++ 模板编程 基础知识】C++ 模板类部分特例化的参数顺序
35 0
|
10月前
|
Java Spring
常量or枚举的取舍
常量or枚举的取舍
40 0
Java开发——33.泛型向下限定问题
?extends XX:向下限定,E及其子类
|
存储 Java
Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归
Java面向对象(3.1)--方法的重载,可变个数的形参,值传递机制,递归
110 0
|
存储 Java 程序员
Java语法糖之泛型与类型擦除
Java语法糖之泛型与类型擦除
164 0
Java语法糖之泛型与类型擦除
|
Java 编译器
JDK8在泛型类型推导上的变化
JDK8在泛型类型推导上的变化
|
Java 开发者
泛型(泛型问题引出)|学习笔记
快速学习 泛型(泛型问题引出)
|
安全 编译器 C#
多用as少用强制类型转换
多用as少用强制类型转换
117 0