java泛型通配符?及上下界(extends,super)保证安全性、灵活性、可读性

embedded/2025/3/17 18:22:31/

在 Java 中,泛型通配符(?)用于表示未知类型,通常用于增强泛型的灵活性。通配符可以与上下限结合使用,以限制泛型的范围。以下是通配符及上下限的使用示例:


1. 无界通配符 (?)

无界通配符表示可以接受任意类型的泛型参数。

java">public static void printList(List<?> list) {for (Object element : list) {System.out.println(element);}
}
  • 示例调用:
    java">List<Integer> intList = Arrays.asList(1, 2, 3);
    List<String> stringList = Arrays.asList("Hello", "World");
    printList(intList);    // 输出: 1 2 3
    printList(stringList); // 输出: Hello World
    

2. 上界通配符 (<? extends T>)

上界通配符表示泛型类型必须是 T 或其子类。

java">public static double sumOfList(List<? extends Number> list) {double sum = 0.0;for (Number number : list) {sum += number.doubleValue();}return sum;
}
  • 示例调用:
    java">List<Integer> intList = Arrays.asList(1, 2, 3);
    List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);
    System.out.println(sumOfList(intList));    // 输出: 6.0
    System.out.println(sumOfList(doubleList)); // 输出: 6.6
    

3. 下界通配符 (<? super T>)

下界通配符表示泛型类型必须是 T 或其父类。

java">public static void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);list.add(3);
}
  • 示例调用:
    java">List<Number> numberList = new ArrayList<>();
    addNumbers(numberList);
    System.out.println(numberList); // 输出: [1, 2, 3]
    

4. 上下限通配符的综合使用

上下限通配符通常用于泛型类或方法中,以限制泛型类型的范围。

java">public static <T> void copy(List<? extends T> src, List<? super T> dest) {for (T item : src) {dest.add(item);}
}
  • 示例调用:
    java">List<Integer> srcList = Arrays.asList(1, 2, 3);
    List<Number> destList = new ArrayList<>();
    copy(srcList, destList);
    System.out.println(destList); // 输出: [1, 2, 3]
    

总结:

  1. ?:无界通配符,接受任意类型。
  2. <? extends T>:上界通配符,限制为 T 或其子类。
  3. <? super T>:下界通配符,限制为 T 或其父类。

通过合理使用通配符和上下限,可以增强泛型的灵活性,同时保证类型安全。


http://www.ppmy.cn/embedded/173392.html

相关文章

前缀和算法第一弹(一维前缀和和二维前缀和)

目录 前言 1. 一维前缀和 &#xff08;1&#xff09;题目及示例 ​编辑 &#xff08;2&#xff09;暴力解法 &#xff08;3&#xff09;算法优化 2. 二维前缀和 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;暴力解法 &#xff08;3&#xff09;算…

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆&#xff0c;邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible &#xff1b; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

MySQL时间溢出原理、影响与解决方案

一、问题背景与现象复现 操作场景&#xff1a; 本文将手把手带您了解mysql时间溢出原理、实战影响与全面解决方案&#xff0c;所有代码均通过dblens for mysql数据库工具验证&#xff0c;推荐使用该工具进行可视化数据库管理和开发。 在MySQL 5.7环境中&#xff0c;若通过命令…

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains&#xff08;全家桶: IDEA、WebStorm、GoLand、PyCharm&#xff09; 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具&#xff0c;但从 2024.02 版本起&#xff0c;JetBrains 调整了试用政策&#xff0c;新用户不再享有默认的 30 天免费试用…

【Maven教程与实战案例】

文章目录 前言一、Maven是什么&#xff1f;二、Maven的安装与配置1. 安装前置条件2. 下载与配置 Maven3. 验证安装 三、Maven的核心概念1. POM.xml 文件2. 构建生命周期与插件机制 四、实战项目示例1. 项目目录结构2. 编写代码App.javaAppTest.java 3. 构建项目4. 运行项目 前言…

应用层之网络应用模型,HTTP/HTTPS协议

应用层是网络协议栈的最顶层&#xff0c;直接为应用程序提供通信服务&#xff0c;定义了不同主机间应用进程交互的规则&#xff0c;包括报文类型、语法、语义及通信时序 一、网络应用模型 1.定义及特点 模型定义核心特点典型应用场景C/S客户端向服务器发起请求&#xff0c;服…

工厂变电所运维云平台解决方案-直击运维痛点,重塑高效安全运维典范

1、概述 变电所运维云平台可以看做是电力监控系统的网络应用延伸&#xff0c;变电所运维云平台通过互联网&#xff0c;电力运维人员通过手机可以随时随地了解工厂配电系统的运行情况&#xff0c;做到无人值守或者少人值守&#xff0c;同时可以监测用能状况、漏电、线缆异常发热…

[特殊字符] 深度实战:Android 13 系统定制之 Recovery 模式瘦身指南

&#x1f31f; 核心需求 在 Android 13 商显设备开发中&#xff0c;需精简 Recovery 模式的菜单选项&#xff08;如Reboot to bootloader/Enter rescue&#xff09;&#xff0c;但直接修改g_menu_actions后在User 版本出现黑屏卡死问题&#xff0c;需综合方案解决。 &#x1f5…