我有一个包含元素类型为 T 的数组(或列表)和一些元数据的接口。
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
}
}
我怀疑在我的问题中有一些有趣的Kotlin泛型教训。有人能告诉我编译器在幕后做了什么以及为什么Array会失败而List不会吗?在这种情况下,是否有惯用的方法使Array实现编译通过?
额外的问题:我之所以使用Array而不是List的唯一原因是我经常看到Kotlin开发人员喜欢使用Arrays。是这样吗?如果是的话,为什么?