【问题标题】:How does one pass an Array<Int> to a vararg Int function using the Spread Operator?如何使用展开运算符将 Array<Int> 传递给 vararg Int 函数?
【发布时间】:2018-02-18 19:38:17
【问题描述】:

我有一个可变参数函数,它需要多个Ints。我有一个 Array&lt;Int&gt; 想用作输入。

不成功的尝试:

这是我尝试使用Spread Operator 调用该函数:

fun printNumbers(vararg numbers: Int) {
    numbers.forEach { it -> println(it) }
}

val numbers: Array<Int> = arrayOf(1, 2, 3)
printNumbers(*numbers)

但是,我收到以下类型不匹配错误:

error: type mismatch: inferred type is Array<Int> but IntArray was expected
printNumbers(*arrayOf<Int>(1, 2, 3))
              ^

额外的困惑:

我不明白为什么会出现此错误,尤其是因为我可以在 Array&lt;String&gt; 上使用扩展运算符。比如……

fun printStrings(vararg strings: String) {
    strings.forEach { it -> println(it) }
}

val strings: Array<String> = arrayOf("hello", "there", "stackoverflow")
printStrings(*strings)

输出:

hello
there
stackoverflow

尝试纠正错误:

  • 我在网上搜索是否可以将Array&lt;Int&gt; 转换为IntArray,因为这可能会满足编译器的要求。除了opposite conversionIntArrayArray&lt;Int&gt;),我什么都看不到

  • 我尝试在调用arrayOf 时指定泛型类型。例如。 arrayOf&lt;Int&gt;(1, 2, 3)。这(出于显而易见的原因)不起作用。

注意事项:

  • 我使用的是 Kotlin 1.0.3 版

  • 我认为我的一些困惑源于我不明白Array&lt;Int&gt;IntArray 之间的区别以及何时选择其中一个。


如何将Array&lt;Int&gt; 传递给需要多个Ints 的可变参数函数?

【问题讨论】:

    标签: arrays kotlin groovy-spread


    【解决方案1】:

    基本上,Array&lt;Int&gt; 是一个封装的 Integer 对象数组,而IntArray 转换为一组原始int 值(请参阅this answer)。

    要将Array&lt;Int&gt; 传递给可变参数函数,您可以先使用toIntArray() 函数将其转换为IntArray

    val numbers: Array<Int> = arrayOf(1, 2, 3)
    printNumbers(*numbers.toIntArray())
    

    或者,如果可以的话,首先将数组创建为 IntArray - 这样您就可以避免在此过程中分配额外的数组,以及对每个单独的值进行装箱:

    val numbers: IntArray = intArrayOf(1, 2, 3)
    printNumbers(*numbers)
    

    【讨论】:

      【解决方案2】:

      问题是您在创建Array&lt;Int&gt; 时使用了装箱的Integers。这不适用于vararg Int。不过,它适用于 IntArray

      val numbers: Array<Int> = arrayOf(1, 2, 3)
      printNumbers(*numbers.toIntArray())
      

      或者直接创建正确类型的数组:

      val numbers = intArrayOf(1, 2, 3)
      printNumbers(*numbers)
      

      使用IntArray,而不是Array&lt;Int&gt;,消除了装箱开销,这当然是更可取的。

      【讨论】:

      • 感谢您的回答。我很难选择一个标记为已接受的答案。感谢您的努力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2021-04-13
      相关资源
      最近更新 更多