如何使用展开运算符将Array<Int>传入vararg Int函数?
解决Kotlin中Array无法展开传入vararg Int函数的问题
嘿,我完全懂你这种困惑——同样是用展开运算符*,Array<String>能正常传给vararg String的函数,换成Array<Int>就报类型不匹配,这反差确实让人摸不着头脑!
问题根源
其实这是Kotlin里装箱数组和基本类型数组的区别在搞鬼:
Array<Int>是装箱后的对象数组,底层对应Java的Integer[],每个元素都是包装过的Integer对象;- 而
vararg Int参数在底层会被处理成基本类型数组IntArray,对应Java的int[],存的是原始的int值。
这俩本质上是不同的数组类型,所以直接用*展开Array<Int>自然会类型不匹配。而Array<String>本身就是引用类型数组,和vararg String的底层类型(String[])完全一致,所以不会有问题。
解决方案
只需要把Array<Int>转换成对应的基本类型数组IntArray,再用展开运算符传入就可以了,Kotlin给我们提供了现成的转换方法:
// 示例vararg函数 fun calculateSum(vararg numbers: Int): Int { return numbers.sum() } // 你的Array<Int>实例 val myIntArray = arrayOf(10, 20, 30) // 转换后展开调用 val total = calculateSum(*myIntArray.toIntArray()) println(total) // 输出60
如果你的场景里经常需要做这种转换,也可以封装一个扩展函数简化操作:
fun Array<Int>.toVarargInt() = this.toIntArray() // 调用时更简洁 calculateSum(*myIntArray.toVarargInt())
额外提醒
如果可以的话,建议在定义vararg函数时,如果参数是基本类型,优先考虑用对应的基本类型数组来接收(比如IntArray),或者直接在创建数组时就用intArrayOf()代替arrayOf(),这样就能避免后续的转换步骤:
// 直接创建IntArray,无需转换 val myIntArray = intArrayOf(10, 20, 30) calculateSum(*myIntArray) // 直接展开调用
内容的提问来源于stack exchange,提问作者byxor
相关产品推荐
相关产品推荐

