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);
我正在创建我的 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);