You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用展开运算符将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:47:21