这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
无界通配符
无界通配符类型是使用通配符(?)指定的,例如List<?>。这称为未知类型列表。如下两种情况推荐使用无界通配符:
- 如果你正在编写一个可以使用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();
}
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<?>中。通配符使用指南部分提供了关于如何确定在给定情况下应该使用何种通配符(如果有的话)的更多信息。