下界通配符(? super Type)

2024-01-02 02:44
文章标签 type super 通配符 下界

本文主要是介绍下界通配符(? super Type),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在Java中,? super Type是一个下界通配符,表示参数化类型的下限是Type。这意味着容器可以持有Type类型的任何对象或者Type的父类型对象。

使用场景

  这种类型的通配符通常用于泛型方法中,允许方法接受Type的实例或其父类型的集合。这是基于PECS原则(Producer Extends, Consumer Super),即如果你需要一个提供(生产)指定类型元素的集合,使用? extends;如果你需要一个消费(接受)指定类型元素的集合,使用? super

例子

  假设有一个基类Animal和两个子类DogCat

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

  现在,我们有一个方法,它的目的是往一个集合里添加Dog对象:

public void addDogsToList(List<? super Dog> dogs) {dogs.add(new Dog()); // 这是允许的,因为List可以是Dog或其父类型
}

  这个方法接受的参数是一个列表,这个列表的类型是DogDog的任何父类型。因此,以下的调用都是有效的:

List<Animal> animalList = new ArrayList<>();
List<Dog> dogList = new ArrayList<>();
List<Object> objectList = new ArrayList<>();addDogsToList(animalList); // 正确:Animal是Dog的父类型
addDogsToList(dogList);    // 正确:列表的类型正好是Dog
addDogsToList(objectList); // 正确:Object是所有类的父类型

  在这个例子中,无论是Animal列表、Dog列表还是Object列表,都可以传递给addDogsToList方法,因为它们都满足? super Dog的条件。这样做的好处是,你可以将方法的使用范围扩展到更通用的类型,同时仍然能够向集合中添加特定类型的元素(在本例中是Dog)。

遍历

  使用? super Type时,遍历集合可能会受到一些限制,因为你不知道集合中元素的确切类型。你只能确保它们是Type或其父类的实例。在遍历时,通常需要将元素视为Type的父类类型,这样会丢失与Type相关的特定信息。

例如

public void processAnimals(List<? super Animal> animals) {for(Object obj : animals) {// 因为不确定List的具体类型,只能将元素当作Object处理// 如果需要使用Animal特有的方法或属性,需要进行类型转换if (obj instanceof Animal) {Animal animal = (Animal) obj;// 现在可以调用Animal类的方法}}
}

总结

  ? super Type通配符的使用提高了代码的灵活性,它允许你编写能够接受更广泛类型集合的泛型方法,同时保证了向这些集合中添加元素的类型安全。这是PECS原则中的“Consumer Super”部分,适用于你的集合是消费或接受元素的情况。在遍历这样的集合时,通常需要将元素视为最通用的类型(如Object),除非进行显式的类型转换。

这篇关于下界通配符(? super Type)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/561125

相关文章

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

问:Super与this在Java中有什么区别?

this: this 关键字用于引用当前对象。它通常用于区分成员变量和方法参数或局部变量。在实例方法中,this 指向调用该方法的对象。在构造函数中,this 指向正在被初始化的对象。 super: super 关键字用于引用父类(超类)的构造函数、方法或变量。在子类的构造函数中,super() 用于调用父类的构造函数。在子类的方法中,super.methodName() 用于调用父类的方法。

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

Linus常用的快捷键与shell常用通配符

一,常用快捷键: Ctrl+c这一个快捷键在Linux下的作用是强行终止当前程序(但不退出终端),其实在其他一些软件,比如MATLAB中,Ctrl+c也有终止程序的作用,如果你的程序进入了死循环,就可以用Ctrl+c来终止程序。 除了最普遍的Ctrl+c之外,还有以下快捷键:   按键  作用Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后

通配符掩码

1. 基本概念 在计算机网络中,通配符掩码(Wildcard Mask)通常与子网掩码一起使用,用于在配置网络设备(如路由器或交换机)时指定要匹配的IP地址范围。通配符掩码实际上是子网掩码的反码(bitwise NOT)。 子网掩码用于指定IP地址中的哪些位表示网络部分,哪些位表示主机部分。通配符掩码则用于指定在路由或访问控制列表(ACL)中哪些位必须匹配,哪些位可以忽略。 2. 通配符掩码

? extends T 和 ? super T分别是什么意思?有什么不同?

<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过add