【问题标题】:Type mismatch Error : Cannont convert from ArrayList<SubClass1> to List<SuperClass>类型不匹配错误:无法从 ArrayList<SubClass 1> 转换为 List<SuperClass>
【发布时间】:2011-04-04 00:00:16
【问题描述】:

这是我的班级结构,我遇到错误的地方

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&lt;? extends SuperClass&gt; list;

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

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

【问题讨论】:

    标签: java list arraylist type-mismatch


    【解决方案1】:

    您似乎正在尝试创建一个仅包含来自特定子类的对象的列表。在这种情况下,您只需要泛型在编译时发挥出色。 (泛型在运行时被删除:))

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

    【讨论】:

      【解决方案2】:

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

       class AClass{
      
            List<? extends SuperClass> list;
      
            public AClass(boolean b){
               if(b)
                list = new ArrayList<SubClass1>();
              else
                list = new ArrayList<SubClass2>();
              }
            }
      }
      

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

      有关通配符的更多信息,请参阅here

      关于你的其他问题:

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

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

      【讨论】:

      • @Roflcoptr,现在我没有收到编译错误,list = new ArrayList();但是当我尝试添加对象时, list.add(subClass1Object);我收到以下错误, List 不适用于参数(SubClass1)
      • @Roflcoptr,我阅读了你提供的链接,它也讨论了我遇到的问题,但它没有给出任何解决方案,它说,“你应该能够弄清楚为什么上面的代码是不允许的。shapes.add()的第二个参数的类型是? extends Shape——Shape的一个未知子类型。由于我们不知道它是什么类型,所以我们不知道它是否是一个Rectangle 的超类型;它可能是也可能不是这样的超类型,因此在此处传递 Rectangle 是不安全的。"
      • 是的。所以简短的回答是。您不能调用 add 方法,因为在运行时,它总是可以是通配符的子类,而不是您要添加的对象的超类型。
      • 感谢您的链接。那么,你能想到其他方法吗?
      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多