java泛型和继承问题

时间:2011-04-05 08:34:49

标签: java generics

我有一个如下定义的列表:

 List<MyBean> beanList = getList();

getList()会返回List<MyBean>类型。

现在,我想将结果传递给接收List<Idisplayable>的方法 并且MyBean确实实现了Idisplayable

这会导致编译器错误。

现在迭代beanList只是为了将其转换为Idisplayable是愚蠢的。建议?

3 个答案:

答案 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>