我有一個包含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開發人員喜歡陣列。是這樣,如果是這樣,爲什麼?