我有一个如下定义的列表:
List<MyBean> beanList = getList();
getList()
会返回List<MyBean>
类型。
现在,我想将结果传递给接收List<Idisplayable>
的方法
并且MyBean
确实实现了Idisplayable
这会导致编译器错误。
现在迭代beanList
只是为了将其转换为Idisplayable
是愚蠢的。建议?
答案 0 :(得分:11)
如果采用List<IDisplayable>
的方法不想向列表中添加任何内容,则应该接受List<? extends IDisplayable>
,而不是“{1}}”重新尝试。
基本问题是,List<MyBean>
与List<IDisplayable>
不是相同(甚至与作业兼容)。
List<IDisplayable>
承诺两件事:它只会返回IDisplayable
个对象,并且会接受(通过add()
)所有IDisplayable
个对象。
List<MyBean>
也只返回IDisplayable
,但不接受任何IDisplayable
不是MyBean
(例如,例如,AnotherDisplayable
。
因此,如果一个方法只迭代列表的内容(实际上是只读的),或者只进行一组有限的操作(删除对象就好了,就像添加null
一样),那么它应该接受而是List<? extends IDisplayable>
。该语法意味着“我接受任何List
只能返回IDisplayable
个对象,但我不关心特定类型”。
答案 1 :(得分:6)
让您的方法接受<? extends Idisplayable>
public void myMethod(List<? extends Idisplayable> list);
答案 2 :(得分:1)
您有两个选择:
如果您有权访问该方法并且它不会更改列表,则只有在这种情况下您才可以更新签名:
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>