【问题标题】:Java arraylist question (capture?)Java 数组列表问题(捕获?)
【发布时间】:2011-05-12 15:52:59
【问题描述】:

在 java 中,我有一个包含以下内容的数组列表

 List<IMyInterface>

我在函数中返回它

List<? extends IMyInterface> getList()

现在我想做以下事情

getList().add(MyElement)

MyElement 扩展接口的地方。

我得到的是一个编译错误,该方法期待其他东西。
在这里:

在列表中添加 (capture ) 不能应用于 (MyElement)。

。虽然 MyElement 扩展了 IMyInterface

顺便说一句:粗体字 Capture 是什么? 谢谢。

【问题讨论】:

  • getList的返回类型是否缺少List?
  • 是的。对不起。我的抄袭不好。固定的。并感谢您的通知。问题仍然存在。
  • 约翰。这个链接真的很棒。 John skeet 在他的评论中只是回答了我的问题。只是我不明白:0)。为什么那样工作不安全?

标签: java arraylist


【解决方案1】:

Add 是一个 consumer 方法,它消耗要添加到列表中的东西,因此您希望添加的任何列表都被限制在下方 (? super Foo) 而不是上方 (@987654323 @)。

更多详情请参阅this question on PECS

为了更具体,假设底层是List&lt;MyBetterInterface&gt;,其中MyBetterInterface 扩展了IMyInterface。现在您仍然可以使用相同的签名实现 getList() 方法 - 但调用者添加仅实现 IMyInteface 的对象显然是无效的,因为现在您将拥有一些不是 @ 987654329@在那里。

所以声明为

List<? super IMyInterface> getModifiableList();

【讨论】:

  • 我还不相信这能按预期工作。 getList().add(MyElement) 可以工作,但是如何声明数组列表? List&lt;? super IMyInterface&gt; list = new ArrayList&lt;A&gt;(); 将给出编译错误(A 实现 IMyInterface)。你能发布一个最小的样本吗?
  • 声明为ArrayList&lt;IMyInterface&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多