3
4

2 回答 2

5

在 Kotlin 中,与 Java 不同,Array<T>在 上是不变的T,因此,因为E那是 的子类型IArray<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 回答