将接口作为arraylist类型提供时编译错误

时间:2011-08-10 12:38:49

标签: java interface arraylist

我有一个定义为

的界面
interface ListItem {
    public String toString();
    public String getUUID();
}

实现该接口的类(BrowseItem)。当我尝试:

ArrayList<ListItem> = (method returning ArrayList of type BrowseItem)

我收到了不兼容的类型错误(found ArrayList<BrowseItem>, require ...<ListItem>

我接近这个错误吗?

3 个答案:

答案 0 :(得分:10)

Java泛型不是协变的。

见(among many other questions on SO):


解决方案:

  • 更改有问题方法的返回类型。也就是说,改变

    List<listItem> = (method returning List of type browseItem)
    // to
    List<listItem> = (method returning List of type listItem)
    
  • 使用通配符协方差(我认为这就是所谓的):

    List<? extends listItem> = (method returning List of type browseItem)
    

    请注意you cannot add items to the list if you take this route


N.B。通常将列表类型声明为List<T>而非ArrayList<T>是一种好习惯。上面的伪代码反映了这一点。

答案 1 :(得分:3)

您的示例不起作用,但您可以使用

ArrayList<? extends ListItem> list = (method returning ArrayList of type browseItem)

这应该有效。

答案 2 :(得分:2)

ArrayList<listItem>不等于ArrayList<browseItem>

他们是严格的类型安全

您可以使用?