Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:使用特定类型的子类创建ArrayList_Kotlin - Fatal编程技术网

Kotlin:使用特定类型的子类创建ArrayList

Kotlin:使用特定类型的子类创建ArrayList,kotlin,Kotlin,我正在尝试创建一个包含抽象类的ArrayList abstract class Data { abstract var data: ArrayList<Entry> abstract class Entry(open var name: String) } 但它一直告诉我,CategoryItem不是下一行的Entry的子类 override var data = ArrayList<CategoryItem>() override var data

我正在尝试创建一个包含抽象类的
ArrayList

abstract class Data {
    abstract var data: ArrayList<Entry>
    abstract class Entry(open var name: String)
}
但它一直告诉我,
CategoryItem
不是下一行的
Entry
的子类

override var data = ArrayList<CategoryItem>() 
override var data=ArrayList()

据我所知,
CategoryItem
是一个
条目
。我做错了什么?

Kotlin中的ArrayList由其泛型参数保持不变。这意味着
ArrayList
不是
ArrayList
的子类型,即使CategoryItem扩展了条目

如果要用
类别项列表
覆盖
条目列表
,至少有两种方法:

  • 您可以将可变
    数组列表
    更改为不可变
    列表
    列表
    在Kotlin中是协变的,因此
    列表
    列表
    的子类型)

  • 您可以将您的
    数据
    抽象变量声明为
    抽象变量数据:ArrayList
    (称为使用站点协方差),但您将无法通过
    数据
    属性在此列表中添加元素,只能获取它们

  • 抽象类数据
    
    这是最简单的强制方式 该ArrayList必须只有Entry的子类

    abstract class Entry(open var name: String)
    class CategoryItem(override var name: String) : Entry(name)
    
    abstract class Data<T:Entry> {
        abstract var data: ArrayList<T>
    }
    
    class Category : Data<CategoryItem>() {
        override var data: ArrayList<CategoryItem>
            get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
            set(value) {}
    }
    
    抽象类条目(打开变量名称:String)
    类CategoryItem(重写变量名称:字符串):条目(名称)
    抽象类数据{
    抽象变量数据:ArrayList
    }
    类别:数据(){
    覆盖变量数据:ArrayList
    get()=TODO(“未实现”)//要更改已创建属性的初始值设定项,请使用文件|设置|文件模板。
    设置(值){}
    }
    
    您是否尝试过退出条目?另外,尝试将其设置为
    var List
    val ArrayList
    ,但不能同时设置为两者。
    abstract class Data<T:Entry>
    
    abstract class Entry(open var name: String)
    class CategoryItem(override var name: String) : Entry(name)
    
    abstract class Data<T:Entry> {
        abstract var data: ArrayList<T>
    }
    
    class Category : Data<CategoryItem>() {
        override var data: ArrayList<CategoryItem>
            get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
            set(value) {}
    }