首页 > 解决方案 > Java 无法调用 addAll() 将子类类型的数组列表添加到类型的数组列表中

问题描述

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

这是我的三个清单:

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

public ArrayList<? extends superClass> combined; // so this accepts all subclasses as well

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

combined.addAll(list1);
combined.addAll(list2);

编译器说:

addAll in arrayList cannot be applied to list1
addAll in arrayList cannot be applied to list2

但是:combined = list1;没有错误。用等号虽然我不能合并这两个列表。

我怎样才能做到这一点?

标签: javainheritancearraylist

解决方案


public ArrayList<? extends superClass> combined

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

因此,您不能将list1or的元素分配给它list2,因为编译器不知道哪个ArrayList<? extends superClass>将分配给该变量)。

例如,如果您使用以下命令初始化该变量:

public ArrayList<? extends superClass> combined = new ArrayList<subClass2>();

您不应该添加到Listtype 的实例中subClass

你可以使用:

public ArrayList<superClass> combined

反而。现在您可以添加ArrayList类型的所有元素superClass或它的任何子类。


推荐阅读