将接口作为arraylist类型提供时编译错误
我有一个定义为的接口
interface ListItem { public String toString(); public String getUUID(); }
以及实现该接口的类( BrowseItem
)。 当我尝试:
ArrayList = (method returning ArrayList of type BrowseItem)
我得到一个不兼容的类型错误( found ArrayList, require ...
)
我接近这个错吗?
Javagenerics不是协变的。
请参阅( 关于SO的许多其他问题 ):
- javagenerics协方差
- Java协方差
- Java集合协方差问题
- 在参数中使用generics集合
解决方案:
-
更改有问题的方法的返回类型。 也就是说,改变
List
= (method returning List of type browseItem) // to List = (method returning List of type listItem) -
使用通配符协方差(我认为这就是所谓的):
List extends listItem> = (method returning List of type browseItem)
请注意, 如果采用此路线 , 则无法将项目添加到列表中 。
注意 ,通常将列表类型声明为List
而不是ArrayList
是一种好习惯。 上面的伪代码反映了这一点。
你的例子不起作用,但你可以使用
ArrayList extends ListItem> list = (method returning ArrayList of type browseItem)
这应该工作。
ArrayList
不等于ArrayList
它们是严格类型安全的
你可以利用?