【问题标题】:Error in casting List of Objects to List of the interface将对象列表转换为接口列表时出错
【发布时间】:2017-06-26 19:49:05
【问题描述】:

我在 JAVA 中有一个名为 ListItem 的接口和一个名为 Folder 的类来实现它。 我有一个文件夹列表,我想将它传递给带有 ListItem 参数列表的方法。 这是那个方法:

List<ListItem> items = new ArrayList<>();
public void addAll(List<ListItem> items) {
    this.items.beginBatchedUpdates();
    for (ListItem item : items) {
        items.add(item);
    }
    this.items.endBatchedUpdates();
}

对于强制转换,我将参数更改为 List of ?扩展 ListItem:

public void addAll(List<? extends ListItem> items) {
    this.items.beginBatchedUpdates();
    for (ListItem item : items) {
        items.add(item);
    }
    this.items.endBatchedUpdates();
}

现在传递参数没有任何错误,但我在 items.add(item) 中有一个错误,表示您无法添加?将 ListItem 扩展到 ListItem 列表。 为什么?

【问题讨论】:

  • 记住接口和类的区别。你不扩展接口,你实现它。 extends 这个词是指父类到子类。
  • 不应该items.add(item);this.items.add(item);
  • @Eran 是的,你是对的,谢谢你!
  • 您不能向其中添加 ListItem,因为真正的泛型可能是 ListItem 的子类 (? extends ListItem)。您可能想要做的是将项目添加到您的成员变量items,您可以通过this.items 访问它。

标签: java android interface casting wildcard


【解决方案1】:

很简单,List&lt;? extends ListItem&gt; 是许多不同类型的超类型,包括List&lt;ListItem&gt;List&lt;FancyListItem&gt;List&lt;SuperExtraFancyListItem&gt; 等等,假设FancyListItemSuperExtraFancyListItemListItem 的子类型。

现在,您的代码尝试将ListItem 添加到可能是List&lt;SuperExtraFancyListItem&gt; 的列表中。这样做真的没有意义 - 这是一个列表,其元素应该是 SuperExtraFancyListItem 对象,而不仅仅是普通的 ListItems。

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    相关资源
    最近更新 更多