Java下界通配符(? super Type)的使用

 更新时间:2024年01月02日 10:19:21   作者:小湘西  
在Java中,? super Type是一个下界通配符,本文主要介绍了Java下界通配符(? 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),除非进行显式的类型转换。

到此这篇关于Java下界通配符(? super Type)的实现的文章就介绍到这了,更多相关Java下界通配符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现快速合并Excel工作表和文件

    Java实现快速合并Excel工作表和文件

    合并 Excel 文件是数据处理中非常常见的需求,但是在不同文件或表格中来回复制粘贴却十分费时费力,下面我们就来看看如何使用Java实现快速合并Excel工作表和文件吧
    2025-11-11
  • springboot自定义starter示例代码

    springboot自定义starter示例代码

    SpringBoot自定义Starter项目的命名建议遵循xxx-spring-boot-starter格式,以避免与官方或第三方Starter产生冲突,核心规范包括自动装配文件的配置,旨在通过spring.factories或spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
    2024-11-11
  • Java线程的start方法回调run方法的操作技巧

    Java线程的start方法回调run方法的操作技巧

    面试过程中经常会被面试官问到为什么我们调用start()方法时会执行run()方法,为什么不能直接调用run()方法,问的一头雾水,今天小编给大家介绍下Java线程的start方法回调run方法的操作技巧,需要的朋友参考下吧
    2017-11-11
  • Spring Web MVC框架学习之配置Spring Web MVC

    Spring Web MVC框架学习之配置Spring Web MVC

    这一篇文章讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法。
    2017-03-03
  • Java中的HashMap集合源码详细解读

    Java中的HashMap集合源码详细解读

    这篇文章主要介绍了Java中的HashMap集合源码详细解读,hash表是一种数据结构,它拥有惊人的效率,它的时间复杂度低到接近O(1)这样的常数级,需要的朋友可以参考下
    2023-11-11
  • java接口私有方法实现过程解析

    java接口私有方法实现过程解析

    这篇文章主要介绍了java接口私有方法实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 基于java变量和作用域以及成员变量的默认初始化(详解)

    基于java变量和作用域以及成员变量的默认初始化(详解)

    下面小编就为大家介绍一下java变量和作用域以及成员变量的默认初始化,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • 永久解决idea git log乱码的问题

    永久解决idea git log乱码的问题

    这篇文章主要介绍了永久解决idea git log乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • restTemplate发送get与post请求并且带参数问题

    restTemplate发送get与post请求并且带参数问题

    这篇文章主要介绍了restTemplate发送get与post请求并且带参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java基础之数组的初始化过程

    Java基础之数组的初始化过程

    Java数组分为静态和动态初始化,静态初始化中,程序员设定元素初始值,系统决定长度;动态初始化中,程序员设定长度,系统提供初始值,数组初始化后长度固定,存储在堆内存中,数组变量在栈内存指向堆内存数组对象,基本类型数组存储数据值,引用类型数组存储对象引用
    2024-10-10

最新评论