无界通配符

Author Avatar
贾康 11月 11, 2016

#无界通配符
无界通配符是指通配符(?),比如List<?>,它被称为未知类型list。无界通配符适用于在以下两种情况:

  1. 如果你要实现的是一个适用于Object作为类型参数的方法。
  2. 调用那些无关于类型参数的方法时,比如List.size或List.clear。实际上Class<?>被频繁的使用因为Class的大部分方法和T无关。
    考虑printList方法如下:
    1
    2
    3
    4
    5
    public static void printList(List<Object> list) {
    for (Object elem : list)
    System.out.println(elem + " ");
    System.out.println();
    }

以上方法的目标是打印任何类型的list,但是它并没有完成它的目标-它只能输出List,不能打印 List, List, List···,因为他们不是List的子类型,我们应该使用List<?>.
1
2
3
4
5
public static void printList(List<?> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}

对于任何确定的类型A,List<A>都是List<?>的子类型,所以我们可以使用print方法来输出任何类型的List

1
2
3
4
List<Integer> li = Arrays.asList(1, 2, 3);
List<String> ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

注意:Arrays.asList方法是一个静态的工厂方法,它把给定的Array转化成大小合适的list。

此外,List<Object>和List<?>是不同的,我们可以List<Object>中插入任何Obejct和Object的子类型,但是我们只能在List<?>中插入null。