Kotlin 泛型 Array<T> 导致“不能使用 T 作为重新定义的类型参数。请改用类“,但 List<T> 则不然
我有一个接口,其中包含T的数组(或列表)和一些元数据。
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): Array<T>
}
如果我编写接口的最简单的实现,我会在:“不能使用T作为重新初始化的类型参数。请改用类。emptyArray()
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
}
}
我怀疑在我的问题中,Kotlin 泛型中有一些有趣的教训。谁能告诉我编译器在引擎盖下做了什么,为什么数组失败了,但List没有?有没有一种习惯用语的方法让 Array 实现在此上下文中编译?
奖励问题:我选择 Array over List 的唯一原因是我经常看到 Kotlin 开发人员喜欢 Arrays。情况是否如此,如果是,为什么?