[英]java generics and inheritance question
我有一個這樣定義的列表:
List<MyBean> beanList = getList();
getList()
返回類型List<MyBean>
。
現在,我想將結果傳遞給接收List<Idisplayable>
的方法,而MyBean
確實實現了Idisplayable
這會導致編譯器錯誤。
現在遍歷beanList
只是將其轉換為Idisplayable
是愚蠢的。 建議?
如果采用List<IDisplayable>
的方法不想在列表中添加任何內容, 則應接受List<? extends IDisplayable>
List<? extends IDisplayable>
,以完全允許您嘗試執行的操作。
基本問題是List<MyBean>
與List<IDisplayable>
不是同一件事(甚至與之兼容)。
List<IDisplayable>
承諾兩件事:它只會返回IDisplayable
對象,並且將接受(通過add()
)所有IDisplayable
對象。
List<MyBean>
也僅返回IDisplayable
,但將不接受任何非MyBean
IDisplayable
(例如, AnotherDisplayable
)。
因此,如果方法僅迭代列表的內容(實際上是只讀的)或僅進行有限的一組操作(刪除對象就可以了,添加null
),那么它應該接受List<? extends IDisplayable>
List<? extends IDisplayable>
。 該語法的意思是“我接受將僅返回IDisplayable
對象但不關心特定類型的任何List
”。
使您的方法接受<? extends Idisplayable>
<? 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傳遞給采用List<Idisplayable> list
關鍵是Collection.addAll聲明為:
addAll(Collection<? extends E> c)
,結果,您可以在此處傳遞List<Idisplayable>
和List<MyBean>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.