包含扩展类的抽象类列表

时间:2014-08-25 13:20:29

标签: java

所以我的问题是这个。我正在使用java,我正在尝试做这样的事情(我正在离线工作,因此我很难给出代码示例,但如果需要,我会):

Class A - abstract class
Class B - abstract class with list<A> as property
Class C - extends class A
Class D - extends class B

在这个类中,在构造函数中,我尝试使用C类中的新对象创建B属性中的列表。

The error is:  Type mismatch: cannot convert from C to A.

我似乎无法使其发挥作用。有什么想法吗?

编辑:

abstract public class A {
   public int theInt;
}

abstract public class B {
   public List<A> theList;
}

abstract public class C extends A {
}

abstract public class D extends B {
   public D(){
       this.theList = new ArrayList<C>();
   }
}

这是代码,我有一个像我提到的编译错误。

2 个答案:

答案 0 :(得分:2)

将其初始化为

List<A> list= new ArrayList<A>();

这样你就可以添加A

的任何子类型

如果您要将ArrayList<C>分配给评论

中显示的内容

这样做

list.AddAll(arrayListC);

答案 1 :(得分:1)

ArrayList<C>不会延伸List<A>。因此分配

this.theList = new ArrayList<C>();

无效。

您可以通过向B

添加类型参数来解决此问题
abstract public class B<T extends A> {
   public List<T> theList
}

abstract public class D extends B<C> {
   public D(){
       this.theList = new ArrayList<C>();
   }
}

您甚至可以向D添加类型参数:

abstract public class D<T extends A> extends B<T> {
   public D(){
       this.theList = new ArrayList<T>();
   }
}

替代:

只需使用ArrayList<A>代替ArrayList<C>


请注意,lst.add(x);不会针对以下类型组合进行编译:

    type of lst             |     type of x
============================|================================
  List<? extends A>         |  A
----------------------------|--------------------------------
  List<C>                   |  E extends A but not C
----------------------------|--------------------------------
  List<? extends A>         |  E extends A