在 Kotlin 中,可变参数(Variable Arguments)允许函数接收数量可变的参数,语法上通过 vararg 关键字声明。以下是关于 Kotlin 可变参数的详细说明:
1. 基本用法
在函数参数前添加 vararg 关键字,即可将该参数声明为可变参数,函数内部可将其视为数组(Array)使用。
kotlin
// 定义一个接收可变参数的函数
fun printNumbers(vararg numbers: Int) {
// 可变参数在函数内部会被当作 Array<Int> 处理
for (num in numbers) {
print("$num ")
}
println()
}
// 调用函数时,可传入任意数量的参数(包括 0 个)
fun main() {
printNumbers(1, 2, 3) // 输出:1 2 3
printNumbers(10, 20) // 输出:10 20
printNumbers() // 输出空行(无参数)
}
2. 可变参数的位置
- 一个函数只能有一个可变参数。
- 可变参数可以放在参数列表的任意位置,但通常建议放在最后(方便调用时省略参数名)。
kotlin
// 可变参数在中间(调用时需显式指定后续参数名)
fun example(str: String, vararg nums: Int, flag: Boolean) {
println("str: $str, nums: ${nums.joinToString()}, flag: $flag")
}
fun main() {
// 可变参数后有其他参数时,必须显式指定参数名
example("test", 1, 2, 3, flag = true)
// 输出:str: test, nums: 1, 2, 3, flag: true
}
3. 传递数组给可变参数
如果已有一个数组,想将其元素作为可变参数传递,需使用扩展运算符 * (也称 “展开运算符”):
kotlin
fun sum(vararg numbers: Int): Int {
return numbers.sum()
}
fun main() {
val arr = intArrayOf(1, 2, 3, 4)
// 使用 * 展开数组,将元素作为可变参数传递
val total = sum(*arr)
println(total) // 输出:10
}
4. 与 Java 可变参数的区别
- Kotlin 可变参数用
vararg声明,Java 用...声明。 - Kotlin 调用 Java 可变参数函数时,可直接传递数组(无需展开);但 Java 调用 Kotlin 可变参数函数时,需通过
toArray()转换。 - Kotlin 可变参数在函数内部是
Array类型,Java 则是数组类型(如int[])。
5. 注意事项
- 可变参数可以接收 0 个或多个参数,灵活性高。
- 若函数同时有可变参数和其他参数,建议将可变参数放在最后,避免调用时必须显式指定参数名。
- 扩展运算符
*仅用于将数组 “展开” 为可变参数,不能用于非数组类型。
通过可变参数,可简化需要处理不定数量参数的场景(如工具类函数、日志打印等)。