寒假打卡08-1月21日

Java 泛型通配符——? extends T 与 ? super T 的区别

在 Java 泛型中,通配符(Wildcard)是一种表示不确定类型的符号,使用问号 ? 来表示。通配符可以用来表示各种类型的集合或容器。在实际编程中,常用的通配符有两种:? extends T? super T。它们分别表示类型的上边界和下边界。

类型通配符

无界通配符

无界通配符 ? 表示可以接受任何类型。它常用于泛型方法和泛型类,以表示可以操作任意类型的集合或容器。

示例代码

下面是一个使用无界通配符的示例,展示了如何定义和使用无界通配符:

import java.util.ArrayList;
import java.util.List;

public class UnboundedWildcardDemo {
    public static void printList(List<?> list) {
        for (Object element : list) {
            System.out.print(element + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        List<Integer> intList = new ArrayList<>();
        intList.add(1);
        intList.add(2);
        intList.add(3);

        List<String> strList = new ArrayList<>();
        strList.add("Hello");
        strList.add("World");

        printList(intList);
        printList(strList);
    }
}

在上述代码中,printList(List<?> list) 方法可以接受任何类型的 List,如 Integer 列表和 String 列表。

上界通配符(? extends T)

上界通配符 ? extends T 表示可以接受 T 类型及其子类的类型。它常用于返回类型是 T 的泛型方法和泛型类,以确保类型的安全性。

示例代码

下面是一个使用上界通配符的示例,展示了如何定义和使用上界通配符:

import java.util.ArrayList;
import java.util.List;

public class UpperBoundedWildcardDemo {
    public static void printNumbers(List<? extends Number> list) {
        for (Number number : list) {
            System.out.print(number + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        List<Integer> intList = new ArrayList<>();
        intList.add(1);
        intList.add(2);
        intList.add(3);

        List<Double> doubleList = new ArrayList<>();
        doubleList.add(1.1);
        doubleList.add(2.2);
        doubleList.add(3.3);

        printNumbers(intList);
        printNumbers(doubleList);
    }
}

在上述代码中,printNumbers(List<? extends Number> list) 方法可以接受 Number 类型及其子类的 List,如 Integer 列表和 Double 列表。

下界通配符(? super T)

下界通配符 ? super T 表示可以接受 T 类型及其超类的类型。它常用于将 T 类型的对象添加到集合或容器中,以确保类型的安全性。

示例代码

下面是一个使用下界通配符的示例,展示了如何定义和使用下界通配符:

import java.util.ArrayList;
import java.util.List;

public class LowerBoundedWildcardDemo {
    public static void addNumbers(List<? super Integer> list) {
        list.add(1);
        list.add(2);
        list.add(3);
    }

    public static void main(String[] args) {
        List<Number> numberList = new ArrayList<>();
        addNumbers(numberList);

        List<Object> objectList = new ArrayList<>();
        addNumbers(objectList);

        System.out.println("Number list: " + numberList);
        System.out.println("Object list: " + objectList);
    }
}

在上述代码中,addNumbers(List<? super Integer> list) 方法可以接受 Integer 类型及其超类的 List,如 Number 列表和 Object 列表。

上界通配符与下界通配符的区别

上界通配符(? extends T)

  • 上界通配符表示可以接受 T 类型及其子类的类型。
  • 常用于返回类型是 T 的泛型方法和泛型类,以确保类型的安全性。
  • 适用于读取操作,但不适合写入操作。

下界通配符(? super T)

  • 下界通配符表示可以接受 T 类型及其超类的类型。
  • 常用于将 T 类型的对象添加到集合或容器中,以确保类型的安全性。
  • 适用于写入操作,但不适合读取操作。

示例对比

import java.util.ArrayList;
import java.util.List;

public class WildcardComparison {
    public static void main(String[] args) {
        List<? extends Number> upperBoundedList = new ArrayList<>();
        // upperBoundedList.add(1); // 编译错误,无法添加元素
        Number num = upperBoundedList.get(0); // 可以读取元素

        List<? super Integer> lowerBoundedList = new ArrayList<>();
        lowerBoundedList.add(1); // 可以添加元素
        // Integer value = lowerBoundedList.get(0); // 编译错误,无法读取元素
    }
}

在上述代码中,我们可以看到上界通配符适用于读取操作,而下界通配符适用于写入操作。

总结

Java 泛型通配符 ? extends T? super T 是非常有用的工具,它们可以帮助我们编写更灵活和类型安全的代码。上界通配符表示可以接受 T 类型及其子类的类型,适用于读取操作;下界通配符表示可以接受 T 类型及其超类的类型,适用于写入操作。

希望通过本篇文章,大家对 Java 泛型通配符有了更深入的了解。在接下来的文章中,我们将继续探讨更多关于 Java 泛型的知识点,敬请期待!

posted @ 2025-01-21 09:09  aallofitisst  阅读(15)  评论(0)    收藏  举报