当前位置:首页 > Java > 正文

Java通配符详解(零基础掌握泛型通配符的使用方法)

在Java编程中,泛型(Generics) 是一个非常重要的特性,它允许我们在编译期就检查类型安全。而 Java通配符 则是泛型中一个强大但容易被初学者忽略的概念。本文将带你从零开始,深入浅出地理解 Java通配符 的基本用法、分类以及实际应用场景,即使是编程小白也能轻松掌握!

什么是Java通配符?

Java通配符(Wildcard)用 ? 表示,用于表示未知类型。它通常出现在泛型类、接口或方法的参数中,用来增强代码的灵活性和复用性。

Java通配符详解(零基础掌握泛型通配符的使用方法) Java通配符 泛型通配符 Java泛型教程 通配符使用方法 第1张

Java通配符的三种类型

Java中的通配符主要分为三类:

  1. 无界通配符(Unbounded Wildcard)?
  2. 上界通配符(Upper Bounded Wildcard)? extends T
  3. 下界通配符(Lower Bounded Wildcard)? super T

1. 无界通配符(?)

表示可以接受任意类型的泛型参数。

public static void printList(List<?> list) {    for (Object obj : list) {        System.out.println(obj);    }}

这个方法可以接收 List<String>List<Integer> 等任何 List 类型。

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

表示类型必须是 T 或其子类。常用于“读取”数据的场景(PECS原则中的“Producer-Extends”)。

// 假设 Number 是 Integer 和 Double 的父类public static double sumOfList(List<? extends Number> list) {    double sum = 0.0;    for (Number n : list) {        sum += n.doubleValue();    }    return sum;}

你可以传入 List<Integer>List<Double>,但不能向该列表中添加元素(除了 null)。

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

表示类型必须是 T 或其父类。常用于“写入”数据的场景(PECS原则中的“Consumer-Super”)。

public static void addNumbers(List<? super Integer> list) {    for (int i = 1; i <= 5; i++) {        list.add(i); // 可以安全添加 Integer    }}

你可以传入 List<Integer>List<Number>List<Object>,因为它们都能容纳 Integer

PECS原则:Producer Extends, Consumer Super

这是使用通配符的重要口诀:

  • 如果你的代码主要是从泛型结构中读取数据(生产者),使用 ? extends T
  • 如果你的代码主要是向泛型结构中写入数据(消费者),使用 ? super T

常见误区与注意事项

  • 不能创建带有通配符的泛型对象,例如 new ArrayList<?>() 是非法的。
  • 通配符只能用于参数、字段或局部变量,不能用于泛型类或方法的定义。
  • 使用 ? extends T 时,不能向集合中添加元素(除了 null),因为编译器无法确定具体类型。

总结

通过本教程,你应该已经掌握了 Java通配符 的基本概念和三种类型。合理使用 泛型通配符 能让你的代码更加灵活、安全且可复用。记住 PECS 原则,并在实际开发中多加练习,你就能熟练运用这一强大的泛型特性。

无论是学习 Java泛型教程 还是提升编码能力,理解 通配符使用方法 都是迈向高级Java开发的重要一步。希望这篇教程对你有所帮助!