类型不匹配错误:Cannont无法从ArrayList 转换为List

这是我的类结构,以及我收到错误的地方

class SuperClass{ //variables } class SubClass1 extends SuperClass{ //variables } class SubClass2 extends SuperClass{ //variables } class AClass{ List list; public AClass(boolean b){ if(b) list = new ArrayList();//getting error here else list = new ArrayList();//and here } void addObjects(SuperClass obj){ list.add(obj); } } 

我怎么解决这个问题? 我应该改变我的设计吗? 怎么样?

加成:

当我改变

 `List list;` 

List list; List list;

我没有收到上一个错误,但是在添加对象时出现了另一个错误,

The method add(capture#2-of ? extends SuperClass) in the type List is not applicable for the arguments (SuperClass)

您似乎正在尝试创建仅包含特定子类中的对象的列表。 在这种情况下,您只需要在编译时使用generics。 (generics在运行时被删除:))

 class AClass { List list; public AClass(){ list = new ArrayList(); } void addObjects(T obj){ list.add(obj); } } 

您应该在ArrayList声明中使用有界通配符:

  class AClass{ List list; public AClass(boolean b){ if(b) list = new ArrayList(); else list = new ArrayList(); } } } 

? 是一个通配符,定义了一个未知类型。 但是通过使用有界通配符,您可以确保它是SuperClass的未知子类型。

有关通配符的更多信息,请参见此处 。

关于你是其他问题:

list.add()的参数类型是? 扩展

SuperClass– SuperClass的未知子类型。 由于我们不知道它是什么类型,我们不知道它是否是超类型。 它可能是也可能不是这样的超类型,因此在那里传递SubClass1或SubClass2是不安全的。