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

byx*_*xor 7 arrays kotlin groovy-spread

我有一个需要多个Ints 的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)
Run Code Online (Sandbox Code Playgroud)

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

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

额外的困惑:

我不明白为什么我会收到这个错误,特别是因为我可以使用扩展运算符Array<String>.例如...

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

val strings: Array<String> = arrayOf("hello", "there", "stackoverflow")
printStrings(*strings)
Run Code Online (Sandbox Code Playgroud)

输出:

hello
there
stackoverflow
Run Code Online (Sandbox Code Playgroud)

尝试纠正错误:

  • 我在网上搜索是否可以转换Array<Int>为a IntArray,因为这可能会满足编译器.我看不出除了任何相反的转换(IntArrayArray<Int>)

  • 我在调用时尝试指定泛型类型arrayOf.例如arrayOf<Int>(1, 2, 3).这(显而易见的原因)不起作用.

笔记:

  • 我正在使用Kotlin版本1.0.3

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


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

zsm*_*b13 11

基本上,Array<Int>Integer引擎盖下的盒装对象数组,同时IntArray转换为原始int值数组(请参阅此答案).

要传入Array<Int>一个vararg函数,您可以使用该toIntArray()函数将其转换为IntArray第一个:

val numbers: Array<Int> = arrayOf(1, 2, 3)
printNumbers(*numbers.toIntArray())
Run Code Online (Sandbox Code Playgroud)

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

val numbers: IntArray = intArrayOf(1, 2, 3)
printNumbers(*numbers)
Run Code Online (Sandbox Code Playgroud)