簡體   English   中英

Java泛型和繼承問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM