文档

Java™ 教程-Java Tutorials 中文版
无界通配符
Trail: Learning the Java Language
Lesson: Generics (Updated)
Section: Wildcards

无界通配符

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

考虑以下方法,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);

注意: 本课程的示例中使用了 Arrays.asList 方法。此静态工厂方法转换指定的数组并返回固定大小的列表。

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


Previous page: Upper Bounded Wildcards
Next page: Lower Bounded Wildcards