问问题
6207 次
2 回答
5
在 Kotlin 中,与 Java 不同,Array<T>
在 上是不变的T
,因此,因为E
那是 的子类型I
,Array<E>
并且Array<I>
不是彼此的子类型。请参阅:方差。
鉴于Array<T>
类型还存储项目类型并且不能完全未经检查的强制转换,解决此问题的最佳方法是创建一个单独的数组。
您可以通过手动创建一个数组并用项目填充它来做到这一点,例如在您的示例中(或使用构造函数Array(n) { ... }
),或者使用.toTypedArray()
应用于数组的列表表示(.asList()
):
fun getMoreInterfaces(): Array<I> {
return E.values().asList().toTypedArray()
}
List<I>
但基本上,如果你不是在性能关键的代码中,你可以只使用 a ,这对于 Kotlin 来说比使用数组更惯用,也更简单。
另请参阅:Kotlin 中列表和数组类型之间的区别
于 2019-01-15T14:46:22.440 回答
1
Array
是 Kotlin 中不变的泛型类型,因此如果需要返回 的实例Array<I>
,则不能返回Array<E>
,即使E
是 的子类型I
。
但是,如果您只使用返回数组中的值,则可以将其类型声明为Array<out I>
. 此类型是类型的协变投影,Array<I>
它允许您同时返回Array<I>
和Array<E>
。
interface I {}
enum class E: I {
A, B, C
}
fun getMoreInterfaces(): Array<out I> {
return E.values()
}
于 2019-07-12T14:08:26.860 回答