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;没有错误。使用等号时,我无法将两个列表合并。
我该如何实现?
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或其任何子类的所有元素。