我有一个包含T和一些元数据的数组(或列表)的接口。Kotlin generics Array <T> results in“Can not use T as a reified type parameter。Use a class instead”但List <T> does not
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): Array<T>
}
如果我写的接口的最简单的实现,我得到一个编译错误的emptyArray()
:“不能使用T作为一个具体化的类型参数使用类代替。”
class ArrayWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
private var myData: Array<T> = emptyArray()
override fun getData(): Array<T> {
return myData
}
fun addData(moreData: Array<T>) {
this.myData += moreData
}
}
但是,如果我改变这两个接口和实现到一个列表,我没有编译时的问题:
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): List<T>
}
class ListWithMetadata<T>(override val someMetadata: Int): DataWithMetadata<T> {
private var myData: List<T> = emptyList()
override fun getData(): List<T> {
return myData
}
fun addData(moreData: Array<T>) {
this.myData += moreData
}
}
我怀疑有在科特林泛型一些有趣的课我的问题里面。任何人都可以告诉我编译器在底层做什么,为什么Array失败,但List不?在这种情况下是否有一种习惯方式来编译数组实现?
奖金问题:我在List上列出的Array的唯一原因是我经常看到Kotlin开发人员喜欢阵列。是这样,如果是这样,为什么?