Unbounded Wildcards

无界通配类型是通配符?的特殊用法。比如 List<?>,我们称之为list of unknown type(未知类型的列表)。在两种情况下,无界通配符能起很大作用:

  • 如果我们正在编写一个可以使用Object类中提供的功能来实现的函数

  • 在代码使用泛型类中不依赖于类型参数的函数。比如List.size或者List.clear,实际上Class<?>经常被用到,因为Class<T>中的大多数函数都不依赖于T

参考下面这个函数printList:

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

该函数的目的是以列表形式打印任何类型,但是该目标是无法实现的————它只能打印Object实例的列表,而不能打印List<Integer>, List<String>, List<Double>等等别的类型,因为它们不是List<Object>的子类型。使用List<?>编写通用的printList函数:

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

对于任何具体类型A来说,List<A>List<?>的子类型,所以我们可以用printList打印任何类型的列表:

List<Integer> li = Arrays.asList(1, 2, 3);
List<String>  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

在本课程的示例中,会使用Arrays.asList函数。此静态工厂方法将指定的数组转换并返回固定大小的列表。

意识到List<Object>List<?>是不一样的是很重要的。你可以往List<Object>中插入Object或者Object的子类型。但是你只能向List<?>中插入null。在Guidelines for Wildcard Use部分中有更多关于如何确定在给定情况下应使用哪种通配符(如果有)的信息。

Last updated