本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的概述,请参见Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参见JDK发布说明。
未限定通配符类型是使用通配符字符(?)来指定的,例如,List<?>。这被称为未知类型的列表。有两种情况下未限定通配符是一个有用的方法:
考虑下面的方法,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<?>中。有关如何确定在给定情况下应该使用何种通配符(如果有的话)的更多信息,请参阅通配符使用指南部分。