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