J'ai une interface qui contient un tableau (ou une liste) de T et de certaines métadonnées.
interface DataWithMetadata<T> {
val someMetadata: Int
fun getData(): Array<T>
}
Si j'écris le plus simple de mise en œuvre de l'interface, j'obtiens une erreur de compilation sur l' emptyArray()
: "Impossible d'utiliser le T comme un réifiée paramètre de type. Utiliser une classe à la place."
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
}
}
Cependant, si je modifie à la fois l'interface et la mise en œuvre d'une liste, je n'ai pas le temps de compilation des questions:
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
}
}
Je soupçonne qu'il ya une intéressante leçon de Kotlin génériques à l'intérieur de mon problème. Quelqu'un peut-il me dire ce que le compilateur fait sous le capot et pourquoi Matrice échoue, mais la Liste n'est pas? Est-il un idiomatiques façon de faire de la Matrice de mise en œuvre de la compilation dans ce contexte?
Question Bonus: La seule raison pour laquelle j'ai atteint pour le Tableau sur la Liste, c'est que je vois souvent Kotlin développeurs faveur des Tableaux. Est-ce le cas, et si oui, pourquoi?