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,因为这可能会满足编译器.我看不出除了任何相反的转换(IntArray到Array<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)