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

    • 如果您正在编写一个可以使用Object类中提供的功能实现的方法。
    • 当代码使用泛型类中不依赖于类型参数的方法时。例如,List.size或List.clear。事实上,Class<?>经常被这样使用,因为 Class中的大多数方法中不依赖于Ť。

    考虑以下方法printList:

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

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

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

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

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

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


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