Java方法中继承ArrayList类型

Java inheritance ArrayList type in method

我正在创建我的 class AClass 的子 class BClass。 AClass 有一个方法将 AClass 类型的 ArrayList 作为其输入。然后我不能将此方法与 BClass 类型的 ArrayList 一起使用。我明白这是为什么,但我不知道该怎么做。我可以将整个 ArrayList 转换为类型 AClass 吗?

我的代码比较复杂,但是这个例子说明了基本问题:

class AClass{
  public float f;
  public AClass(float fstart){
    f = fstart;
  }
  public void setf(ArrayList<AClass> aList){
    for(AClass ax : aList) f += ax.f;
  }
}

class BClass extends AClass{
  public BClass(float fstart){
    super(fstart);
  }
}

AClass a1 = new AClass(1.1);
AClass a2 = new AClass(1.2);
AClass a3 = new AClass(1.3);
BClass b1 = new BClass(2.1);
BClass b2 = new BClass(2.2);
BClass b3 = new BClass(2.3);

ArrayList<AClass> aList = new ArrayList<AClass>();
aList.add(a2); aList.add(a3);
a1.setf(aList);

ArrayList<BClass> bList = new ArrayList<BClass>();
bList.add(b1); bList.add(b2); bList.add(b3);
a2.setf(bList);

方法 setf 需要 ArrayList<AClass>,而不是 ArrayList<BClass>ArrayList<BClass> 不会 扩展 ArrayList<AClass>.

由于 BClass 的一个实例由于继承而实际上也是一个 AClass,那么您可以简单地将第二个列表也声明为 ArrayList<AClass> 类型并将其传递给方法:

ArrayList<AClass> bList = new ArrayList<AClass>();  // instead of BClass
bList.add(b1);
bList.add(b2);
bList.add(b3);
a2.setf(bList);

如果第二个列表必须只包含 BClass 个对象,更好的解决方案是定义 setf 方法来获取包含 [=] 的任何子类型的元素的 ArrayList 18=],通过在参数中使用通用通配符:

class AClass {
    public float f;

    public AClass(float fstart) {
       f = fstart;
    }

    // TODO consider using List instead of ArrayList
    public void setf(ArrayList<? extends AClass> aList) {
       for(AClass ax : aList) f += ax.f;
    }
}

...

ArrayList<BClass> bList = new ArrayList<BClass>();
bList.add(b1);
bList.add(b2);
bList.add(b3);
a2.setf(bList);