kotlin - Kotlin:創建有特定子類類型的ArrayList

我試圖創建一個包含抽象類的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,我做錯什麼了?

时间: 作者:

在Kotlin中,ArrayList的泛型參數是不變的,這意味著ArrayList<CategoryItem>不是ArrayList<Entry>的子類型,即使CategoryItem擴展了Entry。

如果要用Entry列表重寫CategoryItem列表,至少有兩種方法:

可以將可變的ArrayList更改為不可變的List

可以將data抽象變數聲明為abstract var data: ArrayList<out Entry>

作者:

abstract class Data<T:Entry>



這是最容易的方法,強制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) {}


}



作者:
...