为什么嵌套数组元素类型的推理失败



这些都编译得很好:

fun f1(): Array<Any> {
return arrayOf(1)
}
fun f2(): Collection<Any> {
return listOf(1)
}
fun f3(): Collection<Collection<Any>> {
return listOf(listOf(1))
}

但这个给出了以下错误:

fun f4(): Array<Array<Any>> {
return arrayOf(arrayOf(1)) // compilation error here
}

错误:(22,16(Kotlin:类型推断失败。预期的类型不匹配:推断的类型为Array<数组<Int>gt;但是Array<数组<任何>gt;预期

为什么?

f4()中,您使用的是不变性:

Array<Array<Any>>

Array<Any>Array<Int>是不同的类型,并且不可互换。

如果只返回类型,则可以使用协方差:

fun f4(): Array<Array<out Any>> {
return arrayOf(arrayOf(1)) // works
}

由于IntAny的亚型

签名数组:

inline fun <reified T> arrayOf(vararg elements: T): Array<T> (source)

它适用于直接返回数组的方法,因为类型是从返回类型推断出来的。但它不能像你想象的那样进行"嵌套"推理。

如果你分解你的退货声明,这会变得更加清楚:

val arr = arrayOf(1)  // this is an Array<Int> of course
return arrayOf(arr)

现在没有理由将arr赋值标记为错误,是吗?

所以,如果您不想推断Int,您必须自己提供嵌套数组的返回类型:

return arrayOf(arrayOf<Any>(1))

最新更新