Java——通配符以及上下限

devtools/2025/3/4 23:39:20/

在 Java 泛型中,通配符 ? 用于表示未知类型,通常用于增强泛型的灵活性。通配符可以与 上限下限 结合使用,进一步限制类型的范围。以下是通配符及其上下限的详细介绍:


一、通配符 ? 的基本用法

通配符 ? 表示未知类型,可以用于泛型类、泛型接口和泛型方法的参数类型。

示例:使用通配符
java">// 定义一个方法,接受任意类型的 List
public static void printList(List<?> list) {for (Object element : list) {System.out.print(element + " ");}System.out.println();
}public class Main {public static void main(String[] args) {List<Integer> intList = Arrays.asList(1, 2, 3);List<String> strList = Arrays.asList("A", "B", "C");printList(intList); // 输出: 1 2 3printList(strList); // 输出: A B C}
}

二、通配符的上限(Upper Bound)

通配符的上限通过 ? extends T 表示,限制类型必须是 T 或其子类。

1. 使用场景
  • 用于读取数据(生产者)。
  • 不能写入数据(消费者),因为类型未知。
示例:通配符上限
java">// 定义一个方法,接受 Number 或其子类的 List
public static void printNumbers(List<? extends Number> list) {for (Number number : list) {System.out.print(number + " ");}System.out.println();
}public class Main {public static void main(String[] args) {List<Integer> intList = Arrays.asList(1, 2, 3);List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3);printNumbers(intList); // 输出: 1 2 3printNumbers(doubleList); // 输出: 1.1 2.2 3.3// 以下代码会报错,因为 String 不是 Number 的子类// List<String> strList = Arrays.asList("A", "B", "C");// printNumbers(strList);}
}

三、通配符的下限(Lower Bound)

通配符的下限通过 ? super T 表示,限制类型必须是 T 或其父类。

1. 使用场景
  • 用于写入数据(消费者)。
  • 不能读取特定类型的数据(生产者),因为类型未知。
示例:通配符下限
java">// 定义一个方法,向 List 中添加 Integer 或其父类的元素
public static void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);list.add(3);
}public class Main {public static void main(String[] args) {List<Number> numberList = new ArrayList<>();addNumbers(numberList); // 添加 Integer 到 Number 列表System.out.println(numberList); // 输出: [1, 2, 3]List<Object> objectList = new ArrayList<>();addNumbers(objectList); // 添加 Integer 到 Object 列表System.out.println(objectList); // 输出: [1, 2, 3]// 以下代码会报错,因为 String 不是 Integer 的父类// List<String> strList = new ArrayList<>();// addNumbers(strList);}
}

四、通配符的 PECS 原则

PECS(Producer Extends, Consumer Super)是使用通配符的重要原则:

  • Producer Extends:如果泛型是生产者(提供数据),使用 ? extends T
  • Consumer Super:如果泛型是消费者(接受数据),使用 ? super T
示例:PECS 原则
java">// 生产者:从源列表复制数据到目标列表
public static <T> void copy(List<? extends T> src, List<? super T> dest) {for (T element : src) {dest.add(element);}
}public class Main {public static void main(String[] args) {List<Integer> src = Arrays.asList(1, 2, 3);List<Number> dest = new ArrayList<>();copy(src, dest); // 复制 Integer 到 Number 列表System.out.println(dest); // 输出: [1, 2, 3]}
}

五、通配符的注意事项

  1. 不能直接实例化泛型类型
    由于类型擦除,无法直接实例化泛型类型(如 new T())。
  2. 不能用于静态上下文
    类的类型参数不能用于静态方法或静态字段。
  3. 类型擦除
    泛型信息在编译后会被擦除,替换为 Object 或指定的上限类型。

六、总结

  • 通配符 ?:表示未知类型,增强泛型的灵活性。
  • 上限 ? extends T:限制类型必须是 T 或其子类,适用于生产者。
  • 下限 ? super T:限制类型必须是 T 或其父类,适用于消费者。
  • PECS 原则:生产者用 extends,消费者用 super

通过合理使用通配符及其上下限,可以编写更通用、更灵活的泛型代码。


http://www.ppmy.cn/devtools/164591.html

相关文章

I2C总线详细介绍

目录 I2C 总线介绍1. I2C 的原理(1) 双线通信(2) 主从结构(3) 多设备通信(4) 硬件连接 2. I2C 的特性(1) 双向通信(2) 多主设备(3) 速度支持(4) 硬件简单(5) 地址区分 3. I2C 的协议(1) 起始条件&#xff08;Start Condition&#xff09;(2) 地址传输(3) 数据传输(4) 应答信号&…

Vue前端开发-Vant之Signature 组件

Signature组件用于页面的手写签名&#xff0c;它的功能基于Canvas实现&#xff0c;Vant版本必须大于或等于4.3.0才能使用该组件&#xff0c;当完成签名并触发绑定的submit事件后&#xff0c;在事件中&#xff0c;可以获取格式为base64字符串的签名图片&#xff0c;用于保存签名…

如何使用 preg_replace 处理复杂字符串替换

如何使用 preg_replace 处理复杂字符串替换 在 PHP 开发中&#xff0c;preg_replace 是处理正则表达式替换的核心函数&#xff0c;尤其适用于涉及模式匹配、动态替换和多规则处理的复杂场景。本文将通过实际案例和进阶技巧&#xff0c;解析如何高效利用该函数完成复杂字符串操…

ArcGIS操作:08 计算shp面积并添加到属性表

1、打开属性表 注意&#xff1a;计算面积前&#xff0c;需要把shp的坐标系转化为投影坐标系&#xff08;地理坐标系用于定位、投影坐标系用于测量&#xff09; 2、创建字段 3、编辑字段名、类型 4、选择字段&#xff0c;计算几何 5、选择属性、坐标系、单位

Java面试宝典:什么是Java中的双亲委派模型?

Java面试宝典专栏范围&#xff1a;JAVA基础&#xff0c;面向对象编程&#xff08;OOP&#xff09;&#xff0c;异常处理&#xff0c;集合框架&#xff0c;Java I/O&#xff0c;多线程编程&#xff0c;设计模式&#xff0c;网络编程&#xff0c;框架和工具等全方位面试题详解 每…

Spark的数据本地性是在哪个环节确定的

首先是关于Sparks数据本地性是在任务调度将诶单的TaskScheduler确定的&#xff0c;巨日就是TaskSc会获取到分区的位置信息&#xff0c;进而确定每个task的最佳执行位置&#xff0c;会由有限将Task分邓培到数据所在节点&#xff0c;进而减少网络传输&#xff0c;如果首选的位置出…

PyTorch 中使用多进程实现增量训练

在 PyTorch 中使用多进程实现增量训练可以提高训练效率,尤其是在处理大规模数据集时。增量训练意味着在已有模型的基础上继续进行训练。以下是实现多进程增量训练的详细步骤和示例代码: 1. 导入必要的库 import torch import torch.nn as nn import torch.optim as optim i…

Windows环境下Maven的配置

Windows环境下Maven的配置 一、Maven下载 Maven官网地址 apache-maven-3.8.8-bin.zip 二、安装和配置 解压到本地目录&#xff0c;例如&#xff1a;D:\software\apache-maven-3.8.8 新建变量MAVEN_HOMED:\software\apache-maven-3.8.8&#xff08;以自己的安装路径为准&…