将对象列表转换为接口列表时出错

时间:2017-06-26 19:49:06

标签: java android interface casting wildcard

我在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的列表。 为什么? Error

1 个答案:

答案 0 :(得分:3)

很简单,List<? extends ListItem>是很多不同类型的超类型,包括List<ListItem>List<FancyListItem>List<SuperExtraFancyListItem>等等,假设FancyListItemSuperExtraFancyListItemListItem的子类型。

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