Kotlin generics Array<T> results in “Cannot use T as a reified type parameter. Use a class instead” but List<T> does not
我有一个接口,其中包含T的数组(或列表)和一些元数据。
1 2 3 4 | interface DataWithMetadata< T > { val someMetadata: Int fun getData(): Array< T > } |
如果我编写接口的最简单的实现,则会在
1 2 3 4 5 6 7 8 9 10 11 | 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 } } |
但是,如果我同时将接口和实现都更改为列表,则不会有编译时问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 over List的唯一原因是,我经常看到Kotlin开发人员偏爱Arrays。是这种情况,如果是,为什么?
查看kotlin stdlib(jvm)中的
1 | public inline fun <reified @PureReifiable T> emptyArray(): Array< T > |
Cannot use T as a reified type parameter. Use a class instead.
现在,让我们看一下
1 | public fun < T > emptyList(): List< T > = EmptyList |
此实现完全不需要参数
奖金问题:
来自Java和C,我习惯使用
问题在于,
1 | public inline fun <reified @PureReifiable T> emptyArray(): Array< T > |
只能创建像
在此答案中,您可以找到几种解决方法。
尝试返回T时得到
1 2 3 | private fun < T > getData(): T { return T() } |
请参阅在kotlin中创建泛型类的新实例的正确方法是什么?:
1 2 3 4 5 6 7 8 9 10 | private fun < T > create( method: (Int) -> T, value: Int ): T { return method(value) // Creates T(value). } // Usage: create(::ClassName, 1) |
其中
也许这也会有所帮助:
1 2 3 | private inline fun <reified T> getData(): T { return T::class.java.newInstance() } |
但是在我的情况下,我必须返回
最适合我的解决方法是:
1 2 |