下界通配符(? 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),除非进行显式的类型转换。

相关推荐

  1. 通配符(? super Type)

    2024-01-02 07:30:05       45 阅读
  2. 通配符(? extends Type)

    2024-01-02 07:30:05       44 阅读
  3. 二分查找(c++题解)

    2024-01-02 07:30:05       29 阅读
  4. Rust破:前端革新与Vite重构的深度透视(

    2024-01-02 07:30:05       1 阅读
  5. Linux常用通配符

    2024-01-02 07:30:05       17 阅读

最近更新

  1. How to Describe Figures in a Research Article

    2024-01-02 07:30:05       0 阅读
  2. 常见网络攻击方式及防御方法

    2024-01-02 07:30:05       1 阅读
  3. Amazon Bedrock 常用权限分类详解

    2024-01-02 07:30:05       1 阅读
  4. Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?

    2024-01-02 07:30:05       1 阅读
  5. AWS Glue 与 Amazon Redshift 的安全通信配置

    2024-01-02 07:30:05       1 阅读

热门阅读

  1. Python中的os模块中的常用方法

    2024-01-02 07:30:05       30 阅读
  2. Zynq中spi、iic等协议配置器件

    2024-01-02 07:30:05       42 阅读
  3. 循环展开与Duff Device

    2024-01-02 07:30:05       48 阅读
  4. 阿里云服务器节省计划价格便宜_成本优化全解析

    2024-01-02 07:30:05       47 阅读
  5. OpenSSL provider

    2024-01-02 07:30:05       43 阅读
  6. 工具Git详解

    2024-01-02 07:30:05       36 阅读
  7. 构建Python的Windows整合包教程

    2024-01-02 07:30:05       45 阅读
  8. ARM AArch64的虚拟化(virtualization)详解(上)

    2024-01-02 07:30:05       36 阅读