List<Something>
是Something
类型的对象的列表。 List<? extends Something>
是延伸Something
的某些特定类型的对象的列表。
因此,List<Object>
可以有任何类别的对象,延伸Object
。 但List<? extends Object>
只能被初始化为或指定为特定类的对象的列表,其可以延伸Object
这是有用的吗?假设你要编写需要的Objects
一个List
并打印每个项目的方法:
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)
}
}
现在,我们可以通过列出对象的任何子类的来print2
。 print2
将接受List<Integer>
,List<String>
等
在另一面,你不能在列表中添加任何东西里面print2
,因为print2
不知道所使用的Object
的具体亚型。因此,您只能在不需要向List
添加任何内容的方法中使用? extends ...
。
请参阅:http://stackoverflow.com/questions/897935/when-do-java-generics-require-extends-t-instead-of-t-and-is-there-any-down –
Makind类型一个字段'列表
@Tom对,除了我很确定这不是因为类型擦除。 'String'和'Object'已经存在,它们只是被检查,它与擦除类型无关。 – Dukeling