2010-10-27 105 views

回答

14

func需要被定義爲

public void func(List<? extends base> list) { ... } 

這是因爲List<derived>實際上不是一個List<base>,因爲List<base>允許任何形式的在它base,而List<derived>只允許derived和它的子類。使用? extends base可確保除null之外的任何內容都不能添加到List,因爲您不確定該列表可能允許的base的子類。另外,您應該嘗試遵循標準的Java命名約定......以小寫字母開頭的類看起來很奇怪,就像它們是原始類似的。

4

這是因爲如果允許通過列表<派生>,func()將能夠向列表添加基類型元素,從而使列表的通用契約失效(應該只允許派生類型的元素)鍵入內容)

如果在另一方面,你定義FUNC爲

public void func(List<? extends base> list) 

你仍然可以檢索列表基本類型元素,只是將無法對任何新的元素添加到它,這正是你想要的行爲。

0

要解釋的Java的這種行爲,看看下面這個例子

void addItem(List<Base> list) { 
    list.add(new Base()); 
} 

List<Base> l1 = new ArrayList<Base>(); 
addItem(l1); 
Base b = l1.get(0); 

List<Derived> l2 = new ArrayList<Derived>(); 
addItem(l2); 
Derived d = l2.get(0); // Would cause runtime exception. 

這就是爲什麼這個代碼將無法在第一時間編譯。