在java中,我有一个包含以下内容的arraylist
List<IMyInterface>
我在函数
中返回它List<? extends IMyInterface> getList()
现在我想做以下事情
getList().add(MyElement)
其中MyElement扩展了界面。
我得到的是一个编译错误,该方法期待别的东西 这是:
列表中的添加(捕获)无法应用于(MyElement)。
。虽然MyElement扩展了IMyInterface
BTW:大胆捕获这个词是什么? 感谢。
答案 0 :(得分:2)
添加是一个使用者方法,它会消耗要添加到列表中的内容,因此您希望将添加内容的任何列表限制在下面(? super Foo
)而不是上面( Foo extends ?
)。
有关详细信息,请参阅this question on PECS。
为了使其更具体,想象一下底层是List<MyBetterInterface>
,其中MyBetterInterface
扩展IMyInterface
。现在你仍然可以使用相同的签名来实现getList()
方法 - 但是对于调用者而言,添加仅实现IMyInteface
的对象显然无效,因为现在你有了一些对象那里不是MyBetterInterface
。
因此将其声明为
List<? super IMyInterface> getModifiableList();