当前位置:

首页 > 编程开发 > Java 函数中的泛型通配符:上限和下限

Java 函数中的泛型通配符:上限和下限

在Java中,泛型通配符允许表示泛型类型,而不指定具体类型。上限通配符(<?extendsT>)表示类型参数T或其任何子类,允许接受列表中的子类数据。下限通配符(<?superT>)表示T或其任何超类,允许接受列表中的超类数据。通配符可用于实现可调整大小的带泛型的数组列表,允许处理各种类型和进行添加/删除操作。

本文目录

    在 Java 中,泛型通配符允许表示泛型类型,而不指定具体类型。上限通配符 () 表示类型参数 T 或其任何子类,允许接受列表中的子类数据。下限通配符 () 表示 T 或其任何超类,允许接受列表中的超类数据。通配符可用于实现可调整大小的带泛型的数组列表,允许处理各种类型和进行添加/删除操作。

    Java 函数中的泛型通配符:上限和下限

    Java 函数中的泛型通配符:上限和下限

    在 Java 中,我们可以使用通配符来表示泛型类型,允许我们在不指定具体类型的情况下使用泛型。本文将探讨上限和下限通配符,并通过实战案例展示其用法。

    上限通配符

    上限通配符 () 表示类型参数 T 或其任何子类。例如:

    public static  double sum(List numbers) {
      double total = 0;
      for (T num : numbers) {
        total += num.doubleValue();
      }
      return total;
    }

    此函数可以接受任何 Number (如 Integer、Double) 或其子类的列表。我们可以安全地将任何满足 Number 约束的列表传递给此函数,如下所示:

    List ints = List.of(1, 2, 3);
    double sumIntegers = sum(ints); // 编译通过

    下限通配符

    下限通配符 () 表示类型参数 T 或其任何超类。例如:

    public static  void process(List entities) {
      for (T entity : entities) {
        System.out.println(entity.getClass().getName());
      }
    }

    此函数可以接受任何 Number 的超类 (如 Object、Serializable) 的列表。我们可以安全地将任何满足 Number 超类约束的列表传递给此函数,如下所示:

    List objects = List.of("Hello", 123);
    process(objects); // 编译通过

    实战案例

    考虑一个可调整大小的数组列表,我们可以使用泛型通配符来实现它:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class ResizableArrayList {
    
      private List list;
    
      public ResizableArrayList() {
        this(new ArrayList<>());
      }
    
      public ResizableArrayList(List initialList) {
        list = new ArrayList<>(initialList);
      }
    
      public void addAll(List elements) {
        list.addAll(elements);
      }
    
      public void removeAll(List elements) {
        list.removeAll(elements);
      }
    
      public List getList() {
        return list;
      }
    
      public static void main(String[] args) {
        ResizableArrayList numbers = new ResizableArrayList<>(
            Arrays.asList(1, 2, 3)
        );
        numbers.addAll(Arrays.asList(4, 5, 6));
        numbers.removeAll(Arrays.asList(2, 3));
    
        System.out.println(numbers.getList()); // [1, 4, 5, 6]
      }
    }

    这个可调整大小的数组列表可以处理任何类型 E,允许我们向列表中添加或从中删除各种对象。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 泛型
    相关文章 更多
    SQL模糊匹配查询:LIKE通配符使用规则与注意事项
    SQL模糊匹配查询:LIKE通配符使用规则与注意事项

    详细讲解SQL中LIKE模糊匹配的核心通配符使用规则、转义字符处理、与精确匹配的差异,以及索引失效场景与优化注意事项。

    泛型编程\元编程的概念
    泛型编程\元编程的概念

    泛型编程将数据类型参数化,使代码对不同类型执行相同操作,提高复用性。元编程则编写或操纵程序,在编译时完成运行时工作,通过API暴露引擎信息或动态执行代码(如eval()),实现代码生成与反射。

    C#泛型是什么?如何正确使用?
    C#泛型是什么?如何正确使用?

    C#泛型通过类型参数化实现类型安全与代码复用,允许定义泛型类、方法和接口,避免装箱拆箱提升性能,并通过where约束确保类型特定操作的编译时安全性。

    Golang 函数类型是否支持泛型?
    Golang 函数类型是否支持泛型?

    Go语言中的泛型函数类型允许为任意类型定义通用函数签名。具体而言:泛型函数类型的语法为func[type-parameters]<fn-name>[parameters](receiver)(return-values)。类型参数受类型约束限制,确保它们符合特定的条件或实现某些接口。泛型函数类型可以创建适用于各种类型的代码,提供类型安全和代码重用性。

    C++ 泛型编程对代码效率有何影响?
    C++ 泛型编程对代码效率有何影响?

    C++泛型编程显著提高代码效率:减少代码重复性,节省代码行数;增强可重用性,简化代码;编译时间优化,提升执行效率。例如,std::vector容器通过泛型设计,避免针对不同数据类型编写单独代码,提高了代码效率。

    泛型在golang中的限制和注意事项
    泛型在golang中的限制和注意事项

    Go泛型的限制和注意事项:类型转换:泛型方法无法内联执行类型转换,必须显式转换。类型安全:泛型提供类型检查,但类型擦除会导致潜在的类型安全性问题。内存分配:泛型方法和函数可能创建具有类型参数的新对象,需要注意内存分配影响。实战案例:比较任意类型切片:使用泛型参数T,它必须是可比较类型。比较两个切片,如果长度不同或元素不同,则返回1。

    C++ 泛型编程中的性能注意事项是什么?
    C++ 泛型编程中的性能注意事项是什么?

    C++泛型编程的性能注意事项:避免过分割:泛型算法可能多次实例化,导致代码分割和性能下降。避免虚拟调用:泛型类或方法可能产生虚拟调用,从而降低性能。考虑特化:对于常见类型,创建特定于类型的实现可以避免过分割和虚拟调用,提高性能。

    Java 函数泛型的优点和缺点有哪些?
    Java 函数泛型的优点和缺点有哪些?

    Java函数泛型的优点和缺点函数泛型在Java中是一种强大的工具,它允许我们创建能够处理不同类型数据的函数。下面是函数泛型的优点和缺点:优点:可重用性:泛型函数可以被重复使用,而无需为每种数据类型创建单独的函数。代码簡潔:泛型函数可以简化代码,减少对显式类型转换的需要。类型安全:编译器会检查泛型参数的类型,确保类型安全。可扩展性:泛型函数可以轻松扩展以支持新数据类型。缺点:擦除:泛型类型信息在运行时会被擦除,这可能会导致在某些情况下出现类型安全问题。复杂性:泛型的概念可能很难理解,尤其对于初学者而言

    泛型与golang中其它语言特性的比较
    泛型与golang中其它语言特性的比较

    Go中的泛型提供了代码的可重用性,允许创建可用于不同类型数据的代码。与Java和C++的泛型相比,Go的泛型性能开销较低,但类型推理仅为有条件,约束有限。

    如何使用 Golang 泛型创建自定义类型?
    如何使用 Golang 泛型创建自定义类型?

    使用Golang泛型创建自定义类型Golang1.18引入了泛型,这是一种创建类型化参数化代码的方法,有助于创建高度可复用和可维护的代码。它使我们可以定义带有类型占位符的类型,这些类型可以在创建类型实例时被替换为特定类型。定义自定义类型要创建自定义类型,可以使用type关键字,后跟类型名称和类型参数。类型参数用尖括号括起来。例如,我们可以创建名为Pair的类型,它存储任意类型的一对值:typePair[T1,T2any]struct{firstT1se

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026