这些都编译得很好:
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
}
由于Int
是Any
的亚型
签名数组:
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))