2011-04-05 126 views
0

我有這樣定義的列表:Java泛型和繼承問題

List<MyBean> beanList = getList(); 

getList()返回類型爲List<MyBean>

現在,我希望將結果傳遞給接收List<Idisplayable>MyBean做農具Idisplayable

這將導致一個編譯器錯誤的方法。

現在它將愚蠢迭代beanList只是爲了將其投入到Idisplayable。建議?

+0

實現Idisplayable .... – 2011-04-05 08:37:42

回答

11

如果需要List<IDisplayable>不希望任何添加到列表中的方法,那麼它應該接受一個List<? extends IDisplayable>相反,正是讓你正在試圖做什麼。

基本的問題是,一個List<MyBean>不是相同的事情(或甚至分配兼容)一個List<IDisplayable>

A List<IDisplayable>承諾兩件事:它將只會返回IDisplayable對象,它會接受(通過add())所有IDisplayable對象。

一個List<MyBean>也永遠只能返回IDisplayable,但它會不會接受任何IDisplayable,是不是也是一種MyBean(比方說,一個AnotherDisplayable,例如)。因此,如果一個方法只是遍歷列表內容(實際上是隻讀的),或者只執行有限的一組操作(刪除對象正常,就像添加了null),那麼它應該接受List<? extends IDisplayable>。該語法的意思是「我接受任何List只會返回IDisplayable對象,但我不關心具體的類型」。

+0

不錯,我不知道能否添加'null'。好點 – 2011-04-05 08:45:45

+0

@Lukas:這是一個小事實,我花了很長時間學習。 – 2011-04-05 11:11:08

6

讓你的方法接受<? extends Idisplayable>

public void myMethod(List<? extends Idisplayable> list); 
1

你有2種選擇:

如果你有訪問方法,它不改變列表中,只有在這種情況下,你可以更新簽名:

public void myMethod(List<? extends Idisplayable> list); 

作爲另一種選擇,你可以嘗試:

List<Idisplayable> list = new ArrayList<Idisplayable>(); 
list.addAll(getList()); 

,然後通過列表的方法,該方法List<Idisplayable> list

的一點是,Collection.addAll被聲明爲:

addAll(Collection<? extends E> c),因此,您可以通過這裏既有List<Idisplayable>List<MyBean>