我有一个如下定义的列表:
List<MyBean> beanList = getList();
getList()
返回类型 List<MyBean>
.
现在,我想将结果传递给接收 List<Idisplayable>
的方法
和MyBean
是否实现了Idisplayable
这会导致编译器错误。
现在迭代 beanList
是愚蠢的只是将其转换到 Idisplayable
。有什么建议吗?
最佳答案
如果采用 List<IDisplayable>
的方法不想向列表中添加任何内容,那么它应该接受 List<? extends IDisplayable>
,以完全允许您尝试执行的操作。
基本问题是 List<MyBean>
与 List<IDisplayable>
不同(甚至赋值兼容)。
List<IDisplayable>
promise 两件事:它只会返回 IDisplayable
对象,并且它将接受(通过 add()
)所有 IDisplayable
对象。
A List<MyBean>
也只返回 IDisplayable
,但它不会接受任何不是 IDisplayable
的 MyBean
(例如, AnotherDisplayable
)。
因此,如果一个方法仅迭代列表的内容(实际上是只读的)或仅执行一组有限的操作(删除对象很好,就像添加 null
一样),那么它应该接受 List<? extends IDisplayable>
。该语法意味着“我接受任何只会返回 List
对象的 IDisplayable
,但我不关心具体类型”。
关于java泛型和继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549222/