Tといくつかのメタデータの配列(またはリスト)が含まれています。私はインターフェイスの最も簡単な実装を記述する場合Kotlinのジェネリックアレイ<T>は、「Reified typeパラメータとしてTを使用できません。代わりにクラスを使用しますが、リスト<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はなぜ失敗するのか誰にでも教えてもらえますか?このコンテキストでArrayの実装をコンパイルするための慣用的な方法はありますか?
ボーナス質問:私がArray over Listに到達した唯一の理由は、コトリン開発者がアレイを好むことがよくあることです。これが事実ですか、そうなら、なぜですか?