我正在尝试创建一个ArrayList
包含抽象类的
abstract class Data {
abstract var data: ArrayList<Entry>
abstract class Entry(open var name: String)
}
我想强迫ArrayList
它只具有Entry
class Category : Data() {
override var data = ArrayList<CategoryItem>()
class CategoryItem(
override var name: String
):Entry(name)
}
但是它不断告诉我,CategoryItem
它不是Entry
下一行的子类;
override var data = ArrayList<CategoryItem>()
据我所知CategoryItem
是一个Entry
。我究竟做错了什么?
ArrayList
在Kotlin中,其通用参数不变。这意味着,即使CategoryItem扩展了Entry,它也不ArrayList<CategoryItem>
是的子类型ArrayList<Entry>
。
如果要Entry
使用的列表覆盖的列表CategoryItem
,则至少有两种方法:
您可以将可变更ArrayList
改为不可变List
(List
在Kotlin中是协变的,因此List<CategoryItem>
是的子类型List<Entry>
)
您可以将data
抽象变量声明为abstract var data: ArrayList<out Entry>
(称为use-site covariance),但是您将无法通过data
属性在此列表中添加元素,而只能获取它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句