所以我的问题是这个。我正在使用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>();
}
}
这是代码,我有一个像我提到的编译错误。
答案 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