文档

Java™教程
隐藏目录
无界通配符
导航:学习Java语言
课程:泛型(更新)
章节:通配符

无限定通配符

未限定通配符类型是使用通配符字符(?)来指定的,例如,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();
}

因为对于任何具体类型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<?>中。有关如何确定在给定情况下应该使用何种通配符(如果有的话)的更多信息,请参阅通配符使用指南部分。


上一页: 上边界通配符
下一页: 下边界通配符