Java无法调用addAll()将子类类型的arraylist添加到类型<?扩展baseClass>

use*_*538 1 java inheritance arraylist

我有两个类,一个超类和一个继承该超类的子类。我想将两个数组列表合并为一个。这两个数组列表具有不同的类型。一个是超类列表,另一个是子类。

这是我的三个列表:

public ArrayList<subClass> list1;
public ArrayList<superClass> list2;

public ArrayList<? extends superClass> combined; // so this accepts all subclasses as well
Run Code Online (Sandbox Code Playgroud)

然后,我试图完成以下任务:

combined.addAll(list1);
combined.addAll(list2);
Run Code Online (Sandbox Code Playgroud)

编译器说:

addAll in arrayList cannot be applied to list1
addAll in arrayList cannot be applied to list2
Run Code Online (Sandbox Code Playgroud)

但是:combined = list1;没有错误。使用等号时,我无法将两个列表合并。

我该如何实现?

Era*_*ran 5

public ArrayList<? extends superClass> combined
Run Code Online (Sandbox Code Playgroud)

并不意味着“这也接受所有子类”。这意味着您可以为该变量分配an ArrayList<superClass>或an ArrayList<subClass>或an ArrayList<someOtherSubClass>等等。

因此,您无法为其分配list1或的元素list2,因为编译器不知道哪个ArrayList<? extends superClass>将分配给该变量。

例如,如果使用以下方法初始化该变量:

public ArrayList<? extends superClass> combined = new ArrayList<subClass2>();
Run Code Online (Sandbox Code Playgroud)

您不应添加到List类型的实例subClass

您可以使用:

public ArrayList<superClass> combined
Run Code Online (Sandbox Code Playgroud)

代替。现在,您可以添加到ArrayListtype superClass或其任何子类的所有元素。