我有一个包含T和一些元数据的数组(或列表)的接口 .
interface DataWithMetadata {
val someMetadata: Int
fun getData(): Array
}
如果我编写最简单的接口实现,我会在 emptyArray() 上收到编译错误:"Cannot use T as a reified type parameter. Use a class instead."
class ArrayWithMetadata(override val someMetadata: Int): DataWithMetadata {
private var myData: Array = emptyArray()
override fun getData(): Array {
return myData
}
fun addData(moreData: Array) {
this.myData += moreData
}
}
但是,如果我将接口和实现都更改为列表,我没有编译时问题:
interface DataWithMetadata {
val someMetadata: Int
fun getData(): List
}
class ListWithMetadata(override val someMetadata: Int): DataWithMetadata {
private var myData: List = emptyList()
override fun getData(): List {
return myData
}
fun addData(moreData: Array) {
this.myData += moreData
}
}
我怀疑在我的问题中Kotlin泛型有一些有趣的教训 . 任何人都可以告诉我编译器在幕后做了什么以及为什么Array失败但List没有?是否有一种惯用的方法可以在此上下文中编译Array实现?
奖金问题:我达到Array over List的唯一原因是我经常看到Kotlin开发人员喜欢Arrays . 是这种情况,如果是这样,为什么?