Unbounded Wildcards
无界通配类型是通配符?
的特殊用法。比如 List<?>
,我们称之为list of unknown type
(未知类型的列表)。在两种情况下,无界通配符能起很大作用:
如果我们正在编写一个可以使用
Object
类中提供的功能来实现的函数在代码使用泛型类中不依赖于类型参数的函数。比如
List.size
或者List.clear
,实际上Class<?>
经常被用到,因为Class<T>
中的大多数函数都不依赖于T
参考下面这个函数printList
:
该函数的目的是以列表形式打印任何类型,但是该目标是无法实现的————它只能打印Object
实例的列表,而不能打印List<Integer>, List<String>, List<Double>
等等别的类型,因为它们不是List<Object>
的子类型。使用List<?>
编写通用的printList
函数:
对于任何具体类型A
来说,List<A>
是List<?>
的子类型,所以我们可以用printList
打印任何类型的列表:
在本课程的示例中,会使用Arrays.asList函数。此静态工厂方法将指定的数组转换并返回固定大小的列表。
意识到List<Object>
和List<?>
是不一样的是很重要的。你可以往List<Object>
中插入Object
或者Object
的子类型。但是你只能向List<?>
中插入null
。在Guidelines for Wildcard Use部分中有更多关于如何确定在给定情况下应使用哪种通配符(如果有)的信息。
Last updated