Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
无界通配符类型是使用通配符(?)指定的,例如 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(); }
因为对于任何具体类型 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);
重要的是要注意 List<Object> 和 List<?> 是不一样的。你可以将 Object 或 Object 的任何子类型插入 List<Object>。但是你只能将 null 插入 List<?>。Guidelines for Wildcard Use 部分提供了有关如何确定在给定情况下应使用哪种通配符(如果有)的更多信息。