我有一个需要多个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 conversion(IntArray
到Array<Int>
)
我在调用arrayOf
时尝试指定泛型类型。例如。 arrayOf<Int>(1, 2, 3)
。这(显而易见的原因)不起作用。
我正在使用Kotlin版本1.0.3
我认为我的一些困惑源于这样一个事实:我不理解Array<Int>
和IntArray
之间的区别,以及何时选择其中一个。
如何将Array<Int>
传递给需要多个Int
s的vararg函数?
答案 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>
,可以消除拳击开销,这当然更可取。