【问题标题】:Why this inference failure on nested array element type?为什么嵌套数组元素类型的推理失败?
【发布时间】:2018-08-05 14:44:48
【问题描述】:

这些都编译得很好:

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> 但预期为 Array>

为什么?

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

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

    Array<Array<Any>>
    

    Array&lt;Any&gt;Array&lt;Int&gt; 是不同的类型,不能互换。

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

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

    因为IntAny 的子类型

    【讨论】:

      【解决方案2】:

      arrayOf 签名:

      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))
      

      【讨论】:

      • 很好的解释。还有一个问题:listOf 的声明方式类似。为什么/如何在那里工作?
      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多