我有一个定义为
的界面interface ListItem {
public String toString();
public String getUUID();
}
实现该接口的类(BrowseItem
)。当我尝试:
ArrayList<ListItem> = (method returning ArrayList of type BrowseItem)
我收到了不兼容的类型错误(found ArrayList<BrowseItem>, require ...<ListItem>
)
我接近这个错误吗?
答案 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)
N.B。通常将列表类型声明为List<T>
而非ArrayList<T>
是一种好习惯。上面的伪代码反映了这一点。
答案 1 :(得分:3)
您的示例不起作用,但您可以使用
ArrayList<? extends ListItem> list = (method returning ArrayList of type browseItem)
这应该有效。
答案 2 :(得分:2)
ArrayList<listItem>
不等于ArrayList<browseItem>
他们是严格的类型安全
您可以使用?