如何使用Spread Operator将Array <int>传递给vararg Int函数?

时间:2018-02-18 19:38:18

标签: arrays kotlin groovy-spread

我有一个需要多个Int的vararg函数。我有Array<Int>我想用作输入。

尝试失败:

这是我尝试使用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<String>上使用扩展运算符。例如......

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

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

输出:

hello
there
stackoverflow

尝试更正错误:

  • 我在线搜索是否可以将Array<Int>转换为IntArray,因为这可能会满足编译器的要求。除了opposite conversionIntArrayArray<Int>

  • 之外,我看不到任何其他内容
  • 我在调用arrayOf时尝试指定泛型类型。例如。 arrayOf<Int>(1, 2, 3)。这(显而易见的原因)不起作用。

说明:

  • 我正在使用Kotlin版本1.0.3

  • 我认为我的一些困惑源于这样一个事实:我不理解Array<Int>IntArray之间的区别,以及何时选择其中一个。

    < / LI>

如何将Array<Int>传递给需要多个Int s的vararg函数?

2 个答案:

答案 0 :(得分:9)

基本上,Array<Int>是一系列盒装Integer对象,而IntArray则转换为原始int值数组(请参阅this answer )。

要将Array<Int>传递给vararg函数,您可以先使用toIntArray()函数将其转换为IntArray

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

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

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

答案 1 :(得分:3)

问题是您在创建Integer时使用了装箱Array<Int>。这与vararg Int不兼容。它适用于IntArray但是:

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

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

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

使用IntArray而不是Array<Int>,可以消除拳击开销,这当然更可取。