Java 泛型 <? extends T>和<? super T> 详解

简介: 大概来讲:

大概来讲:

  • <? extends T>是"上界通配符"
  • <? super T> 是"下界通配符"
1. 为什么要用通配符和边界?

使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有Fruit类,和它的派生类Apple类。

public class Apple extends Fruit{
}

public class Fruit {

}

然后我在main方法里创建实例对象:


img_56351257f02f0c9c252b1effbcf62a79.png
image.png

逻辑上水果盘子当然可以装苹果,但实际上Java编译器不允许这个操作。会报错,“装苹果的盘子”无法转换成“装水果的盘子”。

Error:(9, 30) java: 不兼容的类型: com.generic.Plate<com.generic.Apple>无法转换为com.generic.Plate<com.generic.Fruit>

所以,就算容器里装的东西之间有继承关系,但容器之间是没有继承关系的。所以我们不可以把Plate<Apple>的引用传递给Plate<Fruit>.

为了让泛型用起来更舒服,Sun的大脑袋们就想出了<? extends T>和<? super T>的办法,来让”水果盘子“和”苹果盘子“之间发生关系。

img_aca22507bc2aa112cdb0735b9340e208.png
image.png

可以看出编译不再报错,程序正常运行。

? super T

这个也就不多解释了,上面的extend是说明实例对象必须是T的派生类。
则super则说明实例对象必须是T的基类。

PECS原则

PECS(Producer Extends Consumer Super)原则

  • 频繁往外读取内容的,适合用上界Extends。
  • 经常往里插入的,适合用下界Super。

总结

  1. 参数写成:T<? super B>,对于这个泛型,?代表容器里的元素类型,由于只规定了元素必须是B的超类,导致元素没有明确统一的“根”(除了Object这个必然的根),所以这个泛型你其实无法使用它,对吧,除了把元素强制转成Object。所以,对把参数写成这样形态的函数,你函数体内,只能对这个泛型做插入操作,而无法读

  2. 参数写成: T<? extends B>,由于指定了B为所有元素的“根”,你任何时候都可以安全的用B来使用容器里的元素,但是插入有问题,由于供奉B为祖先的子树有很多,不同子树并不兼容,由于实参可能来自于任何一颗子树,所以你的插入很可能破坏函数实参,所以,对这种写法的形参,禁止做插入操作,只做读取。

相关文章
|
2月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
236 10
|
4月前
|
安全 Java API
在Java中识别泛型信息
以上步骤和示例代码展示了怎样在Java中获取泛型类、泛型方法和泛型字段的类型参数信息。这些方法利用Java的反射API来绕过类型擦除的限制并访问运行时的类型信息。这对于在运行时进行类型安全的操作是很有帮助的,比如在创建类型安全的集合或者其他复杂数据结构时处理泛型。注意,过度使用反射可能会导致代码难以理解和维护,因此应该在确有必要时才使用反射来获取泛型信息。
216 11
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
151 1
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
108 0
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
95 1
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
116 5
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
112 2
|
Java
【Java】什么是泛型?什么是包装类
【Java】什么是泛型?什么是包装类
143 0
|
Java 程序员 编译器
【Java】继承、super、final、子类构造方法
【Java】继承、super、final、子类构造方法
194 0
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
570 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!