Unbounded Wildcards

无限制通配符类型使用通配符(?)指定,例如List\<?\>。这称为未知类型列表。在两种情况下,无界通配符是一种有用的方法:

  • 如果您正在编写可以使用Object类中提供的功能实现的方法。

  • 当代码在泛型类中使用不依赖于 type 参数的方法时。例如List\.sizeList\.clear。实际上,经常使用Class\<?\>,因为Class\<T\>中的大多数方法都不依赖于T

考虑以下方法printList

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

printList的目标是打印任何类型的列表,但未能实现该目标-它仅打印Object实例的列表;它不能打印List\<Integer\>List\<String\>List\<Double\>等,因为它们不是List\<Object\>的子类型。要编写通用的printList方法,请使用List\<?\>

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

因为对于任何具体类型AList\<A\>List\<?\>的子类型,所以可以使用printList打印任何类型的列表:

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

Note:

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

重要的是要注意List\<Object\>List\<?\>不相同。您可以将ObjectObject的任何子类型插入List\<Object\>。但是您只能将null插入List\<?\>通配符使用准则部分提供了有关如何确定在给定情况下应使用哪种通配符(如果有)的更多信息。