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
也是这样声明的。为什么/如何在那里工作?