java - 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;
没有错误。用等号虽然我不能合并这两个列表。
我怎样才能做到这一点?
解决方案
public ArrayList<? extends superClass> combined
并不意味着“这也接受所有子类”。这意味着您可以为该变量分配 anArrayList<superClass>
或 anArrayList<subClass>
或 anArrayList<someOtherSubClass>
等...
因此,您不能将list1
or的元素分配给它list2
,因为编译器不知道哪个ArrayList<? extends superClass>
将分配给该变量)。
例如,如果您使用以下命令初始化该变量:
public ArrayList<? extends superClass> combined = new ArrayList<subClass2>();
您不应该添加到List
type 的实例中subClass
。
你可以使用:
public ArrayList<superClass> combined
反而。现在您可以添加ArrayList
类型的所有元素superClass
或它的任何子类。
推荐阅读
- angular - 从键值枚举中填充 ng-select 项目
- java - java.io.IOException:下载文件时管道损坏
- laravel - 将多个数组传递给 Laravel 8 中的视图
- c++ - “AddCustomer”未在此范围内声明。错误在哪里?
- c++ - 矩阵大小和循环变量的正确类型
- tensorflow - 如何克服错误的尺寸问题
- vue.js - 我的 Vue“wheel.vue”组件有什么问题?当它呈现为 html 时,它显示为空?
- google-apps-script - 如何在列中生成下一个可用的点十进制符号数
- python - 如何在opencv中替换部分图像?
- python - Tensorflow-gpu 在拟合模型时不使用 GPU