List<Something>
是类型对象的列表Something
。
List<? extends Something>
是扩展的某些特定类型的对象列表Something
。
所以,List<Object>
可以有任何扩展类的对象Object
。但List<? extends Object>
只能初始化或分配为扩展的特定类的对象的列表Object
这什么时候有用?假设您要编写一个方法,该方法采用 a List
ofObjects
并打印每个项目:
void print(List<Object> list) {
for (Object obj: list) {
System.out.println(obj)
}
}
现在,假设您有一个List<Integer>
. 您不能将它传递给上述方法,因为print
需要List<Object>
, 并且List<Integer>
不能分配给List<Object>
. 为了解决这个问题,我们重新定义print
为:
void print2(List<? extends Object> list) {
for (Object obj: list) {
System.out.println(obj)
}
}
现在,我们可以将 Object 的任何子类的 List 传递给print2
. 会print2
接受List<Integer>
等List<String>
另一方面,你不能在里面的列表中添加任何东西print2
,因为print2
不知道使用的具体子类型Object
。因此,您? extends ...
只能在不需要向List
.