使用List.addAll添加List <! - 的编译时错误?将BaseClass - >扩展到另一个

时间:2016-07-01 12:12:23

标签: java generics

在此代码中,最后一行(list1.addAll(list2);)生成编译时错误

  

方法addAll(Collection&lt;?extends capture#3-of?extends BaseClass&gt;)in List&lt;捕获#3?扩展BaseClass&gt;不适用于参数(List&lt; capture#4-of?extends BaseClass&gt;)

我确实意识到如果允许这样做,就有可能将不同类的实例添加到同一个列表中。但是我不知道采取什么方法是正确的。

我的getList()方法需要返回BaseClass的子类,我无法更改该要求。

我有两个列表,以相同的方式声明并包含相同类型的对象,我需要在另一个列表中添加一个。 对此有任何想法将不胜感激。

BaseClass.java

package main;

public class BaseClass {}

Main.java

package main;

import java.util.ArrayList;
import java.util.List;

public class Main {

    private static List<? extends BaseClass> getList() {

        return new ArrayList<>();
    }

    public static void main(String[] args) {

        List<? extends BaseClass> list1 = getList();

        List<? extends BaseClass> list2 = getList();

        list1.addAll(list2); // Compile-time error: "The method addAll(Collection<? extends capture#3-of ? extends BaseClass>) in the type List<capture#3-of ? extends BaseClass> is not applicable for the arguments (List<capture#4-of ? extends BaseClass>)".
    }

}

2 个答案:

答案 0 :(得分:5)

您可以制作新的List<BaseClass>并将两个列表添加到其中:

List<BaseClass> merged = new ArrayList<>();
merged.addAll(list1);
merged.addAll(lise2);

但让getList返回List<BaseClass>可能是个更好的主意。

答案 1 :(得分:2)

编译器无法确定类是否兼容。

例如,list1可以是

类型
List<SubSubSubClass>

并尝试将BaseClass合并到其中。您不能将BaseClass转换为随机子类。 也:

List<? extends BaseClass> list1

将声明基于BaseClass的对象列表,但以下内容将执行相同的操作:

List<BaseClass> list1

试试这个:

 private static List<BaseClass> getList() {

    return new ArrayList<BaseClass>();
}
public static void main(String[] args) {

    List<BaseClass> list1 = getList();

    List<BaseClass> list2 = getList();

    list1.addAll(list2);
}

这将保证您的列表项是所有BaseClass类型或此类型的子类。