Generics 为什么嵌套数组元素类型的推断失败?

Generics 为什么嵌套数组元素类型的推断失败?,generics,kotlin,Generics,Kotlin,这些都很好: fun f1(): Array<Any> { return arrayOf(1) } fun f2(): Collection<Any> { return listOf(1) } fun f3(): Collection<Collection<Any>> { return listOf(listOf(1)) } fun f1():数组{ 返回数组(1) } 乐趣f2():收集{ 返回列表(1) } 乐趣f

这些都很好:

fun f1(): Array<Any> {
    return arrayOf(1)
}

fun f2(): Collection<Any> {
    return listOf(1)
}

fun f3(): Collection<Collection<Any>> {
    return listOf(listOf(1))
}
fun f1():数组{
返回数组(1)
}
乐趣f2():收集{
返回列表(1)
}
乐趣f3():收藏{
返回列表(列表(1))
}
但这一条给出了以下错误:

fun f4(): Array<Array<Any>> {
    return arrayOf(arrayOf(1)) // compilation error here
}
fun f4():数组{
返回arrayOf(arrayOf(1))//此处编译错误
}
错误:(22,16)Kotlin:类型推断失败。预期类型不匹配:推断类型为数组,但预期为数组

为什么?

签名排列:

inline fun <reified T> arrayOf(vararg elements: T): Array<T> (source)
签名阵列:

inline fun <reified T> arrayOf(vararg elements: T): Array<T> (source)
f4()
中,您使用的是不变性:

Array<Array<Any>>
数组
Array
Array
是不同的类型,不能互换

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

fun f4(): Array<Array<out Any>> {
   return arrayOf(arrayOf(1)) // works
}
fun f4():数组{
返回arrayOf(arrayOf(1))//工作
}
由于
Int
Any

的子类型,因此在
f4()
中使用了不变性:

Array<Array<Any>>
数组
Array
Array
是不同的类型,不能互换

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

fun f4(): Array<Array<out Any>> {
   return arrayOf(arrayOf(1)) // works
}
fun f4():数组{
返回arrayOf(arrayOf(1))//工作
}

因为
Int
Any

的子类型。还有一个问题:
listOf
也是这样声明的。为什么/如何在那里工作?很好的解释。还有一个问题:
listOf
也是这样声明的。为什么/如何在那里工作?