Java 使用List.addAll添加列表时出现编译时错误<;?扩展基类>;另一个

Java 使用List.addAll添加列表时出现编译时错误<;?扩展基类>;另一个,java,generics,Java,Generics,在这段代码中,最后一行(list1.addAll(list2);)生成编译时错误 类型列表中的addAll(Collection)方法?extends BaseClass>不适用于参数(列表) 我确实意识到,如果允许这样做,就可以将不同类的实例添加到相同的列表中。但是我不知道该怎么做 我的getList()方法需要返回BaseClass的子类,我无法更改该要求 我有这两个列表,以相同的方式声明并包含相同类型的对象,我需要将一个添加到另一个列表中。 如果您对此有任何想法,我们将不胜感激 BaseC

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

类型列表中的addAll(Collection<扩展捕获#3-of?扩展基类>)方法?extends BaseClass>不适用于参数(列表

我确实意识到,如果允许这样做,就可以将不同类的实例添加到相同的列表中。但是我不知道该怎么做

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

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

BaseClass.java

package main;

public class BaseClass {}
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>)".
    }

}
Main.java

package main;

public class BaseClass {}
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>)".
    }

}
packagemain;
导入java.util.ArrayList;
导入java.util.List;
公共班机{

私有静态列表您可以创建一个新的
列表
,并将两个列表添加到该列表中:

List<BaseClass> merged = new ArrayList<>();
merged.addAll(list1);
merged.addAll(lise2);
List merged=new ArrayList();
合并。添加全部(列表1);
合并。添加全部(lise2);

但是让
getList
返回
List

可能是一个更好的主意,因为编译器无法确定这些类是否兼容

在示例中,list1可以是

List<SubSubSubClass>
列表
并尝试将基类合并到其中。不能将基类强制转换为随机子类。 此外:

ListGood指出,
List list1
将声明一个基于
BaseClass
的对象列表,就像我的
列表一样
 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);
}