2011-05-05 22 views

回答

6

使用Object作爲類型參數與使用?完全不同。見這2種方法:

void frobnicate1(List<?> someList); 
void frobnicate2(List<Object> someList); 

兩者都將收到一個List,都將獲得Object時,他們得到的,而只有Listfrobnicate1可以用List<String>甚至List<?>被調用,frobnicate2可以元素List<Object>(或null)調用。

請注意,實例化參數化類型不能用通配符類型參數(?)完成。

所以下面將不起作用

List<?> someList = new ArrayList<?>(); 

你將不得不使用Object(或任何其他非通配符類型),而不是:

List<?> someList = new ArrayList<Object>(); 

而且不用擔心顯式強制轉換:JVM可以將其優化掉(可能會),因爲任何參考值到Object的強制轉換總是會成功。

+0

感謝您的解釋。爲了清楚起見,當我想接受'null'時,我應該使用'frobnicate2'? – 2011-05-05 08:34:45

+1

@ Gabriel:**兩個**版本都會接受'null'。 'frobnicate2'的唯一優點是你可以*添加* List到'List'對象,因爲它被定義爲接受所有'Object's。 – 2011-05-05 08:51:44

+0

再次感謝您,那是我在第一個地方找到的答案。 – 2011-05-05 09:06:07

3

我發現它有助於記住這樣說:

名單<對象> =其中,每個元素都被視爲Object

列表實例的列表<> =一個列表,其中每個元素是什麼?視爲特定但未知的子類Object

相關問題