类型不匹配错误:无法将ArrayList<SubClass1>转换为List<SuperClass>。

6
这是我的类结构,以及我遇到的错误。
class SuperClass{
//variables
}

class SubClass1 extends SuperClass{
//variables
}

class SubClass2 extends SuperClass{
//variables
}

class AClass{
List<SuperClass> list;

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

}

我该如何解决这个问题?我需要改变我的设计吗?怎么改?

补充:

当我改变了

`List<SuperClass> list;`

List<? extends SuperClass> list;翻译为:列表List<? extends SuperClass> list;

我没有得到之前的错误,但是在添加对象时出现了另一个错误:

List<capture#2-of ? extends SuperClass>中的方法add(capture#2-of ? extends SuperClass)不适用于参数(SuperClass)。

2个回答

4

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

 class AClass{

      List<? extends SuperClass> list;

      public AClass(boolean b){
         if(b)
          list = new ArrayList<SubClass1>();
        else
          list = new ArrayList<SubClass2>();
        }
      }
}
?是通配符,表示一个未知类型。但通过使用有界通配符,您可以确保它是SuperClass的未知子类型。
有关通配符的更多信息,请参见此处
关于您的另一个问题: list.add()方法的参数类型为? extends SuperClass,即SuperClass的未知子类型。由于我们不知道它的类型,也不知道它是否是超类型。因此,在这里传递SubClass1或SubClass2是不安全的。

@Roflcoptr, 现在我在以下代码处不再遇到编译错误:list = new ArrayList();但是,当我尝试添加对象时,list.add(subClass1Object);我遇到了以下错误:类型List<capture#2-of ? extends SuperClass>中的方法add(capture#2-of ? extends SuperClass)对于参数(SubClass1)不适用。 - Eternal Noob
@Roflcoptr,我看了你给的链接,它也讨论了我遇到的问题,但是它没有给出任何解决方案,它说:“你应该能够找出为什么上面的代码被禁止。shapes.add()的第二个参数的类型是? extends Shape——Shape的未知子类型。由于我们不知道它是什么类型,我们不知道它是否是Rectangle的超类型;它可能是也可能不是这样的超类型,因此在那里传递一个Rectangle是不安全的。” - Eternal Noob
是的。所以简短的答案是,你不能调用add方法,因为在运行时,它始终可以是通配符的子类,但不是你想要添加的对象的超类型。 - RoflcoptrException
请参见此处:https://dev59.com/uUrSa4cB1Zd3GeqPYKUB#1845319 - RoflcoptrException
谢谢提供链接。那么,你能想到其他的方法吗? - Eternal Noob

4

看起来你正在尝试创建一个只包含特定子类对象的列表。这种情况下,你只需要让泛型在编译时正常工作即可。(泛型在运行时被擦除 :))

class AClass<T extends SuperClass> {
    List<T> list;

    public AClass(){
        list = new ArrayList<T>();
    }

    void addObjects(T obj){
        list.add(obj);
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接