我有這樣定義的列表:Java泛型和繼承問題
List<MyBean> beanList = getList();
getList()
返回類型爲List<MyBean>
。
現在,我希望將結果傳遞給接收List<Idisplayable>
和MyBean
做農具Idisplayable
這將導致一個編譯器錯誤的方法。
現在它將愚蠢迭代beanList
只是爲了將其投入到Idisplayable
。建議?
我有這樣定義的列表:Java泛型和繼承問題
List<MyBean> beanList = getList();
getList()
返回類型爲List<MyBean>
。
現在,我希望將結果傳遞給接收List<Idisplayable>
和MyBean
做農具Idisplayable
這將導致一個編譯器錯誤的方法。
現在它將愚蠢迭代beanList
只是爲了將其投入到Idisplayable
。建議?
如果需要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
對象,但我不關心具體的類型」。
不錯,我不知道能否添加'null'。好點 – 2011-04-05 08:45:45
@Lukas:這是一個小事實,我花了很長時間學習。 – 2011-04-05 11:11:08
讓你的方法接受<? extends Idisplayable>
public void myMethod(List<? extends Idisplayable> list);
你有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>
實現Idisplayable .... – 2011-04-05 08:37:42