ZetCode

Kotlin vararg 关键字

最后修改于 2025 年 4 月 19 日

Kotlin 的 vararg 关键字允许函数接受相同类型的可变数量的参数。本教程通过实际示例深入探讨了 vararg 关键字。

基本定义

Kotlin 中的 vararg 关键字代表“可变参数”。它使函数能够接受任意数量的指定类型的参数。这些参数在函数体中被视为一个数组。

基本 vararg 函数

vararg 的最简单用法是创建一个可以接受多个相同类型参数的函数。在函数内部,这些参数作为数组可用。

BasicVararg.kt
package com.zetcode

fun printNumbers(vararg numbers: Int) {
    for (number in numbers) {
        println(number)
    }
}

fun main() {
    printNumbers(1, 2, 3, 4, 5)
}

此示例显示了一个接受任意数量 Int 参数的函数。vararg 参数 numbers 在函数内部被视为一个 Int 数组。我们在调用它时可以传递任意数量的整数。

vararg 与其他参数

一个函数可以同时具有常规参数和 vararg 参数。除非后面是 lambda 参数,否则 vararg 参数通常是最后一个参数。

MixedParameters.kt
package com.zetcode

fun greet(prefix: String, vararg names: String) {
    for (name in names) {
        println("$prefix $name")
    }
}

fun main() {
    greet("Hello", "John", "Jane", "Bob")
}

在这里,我们有一个带有常规 String 参数和一个 vararg String 参数的函数。该函数使用前缀打印每个名称。请注意 vararg 参数是如何出现在常规参数之后的。

vararg 的展开运算符

当您有一个数组并且想要将其元素作为单独的参数传递给 vararg 函数时,请使用展开运算符 (*)。

SpreadOperator.kt
package com.zetcode

fun sumNumbers(vararg numbers: Int): Int {
    return numbers.sum()
}

fun main() {
    val nums = intArrayOf(1, 2, 3, 4, 5)
    val total = sumNumbers(*nums)
    println(total) // Output: 15
}

此示例演示了如何使用展开运算符将数组传递给 vararg 函数。*nums 语法将数组解包为函数可以处理的单个元素。

多个 vararg 参数

一个函数只能有一个 vararg 参数。尝试声明多个 vararg 参数将导致编译错误。

MultipleVarargs.kt
package com.zetcode

// This won't compile - only one vararg parameter allowed
// fun invalid(vararg first: Int, vararg second: Int) {}

fun valid(vararg numbers: Int, message: String) {
    println("$message: ${numbers.joinToString()}")
}

fun main() {
    valid(1, 2, 3, message = "Numbers")
}

注释的函数显示了声明多个 vararg 参数的无效尝试。有效的示例显示了一个具有一个 vararg 参数和常规命名参数的有效函数。

不同类型的 vararg

虽然 vararg 参数必须是相同的类型,但您可以使用 Any 来接受不同的类型,尽管这并非类型安全的。

AnyVararg.kt
package com.zetcode

fun printAll(vararg items: Any) {
    for (item in items) {
        println(item)
    }
}

fun main() {
    printAll("Hello", 42, 3.14, true)
}

此函数通过使用 Any 作为 vararg 类型来接受任何类型的参数。虽然具有灵活性,但这种方法会失去类型安全性,应谨慎使用。

构造函数中的 vararg

vararg 关键字也可以在类构造函数中使用,允许使用可变参数创建对象。

ConstructorVararg.kt
package com.zetcode

class ShoppingCart(vararg items: String) {
    private val cartItems = items.toList()
    
    fun showItems() {
        println("Cart contains: ${cartItems.joinToString()}")
    }
}

fun main() {
    val cart = ShoppingCart("Apple", "Banana", "Orange")
    cart.showItems()
}

此示例演示了一个带有 vararg 构造函数参数的类。构造函数接受任意数量的 String 参数,然后这些参数作为列表存储在类中。

vararg 与默认参数

Kotlin 允许将 vararg 与默认参数结合使用,从而在函数调用中提供灵活性。

DefaultVararg.kt
package com.zetcode

fun createGreeting(
    vararg names: String,
    greeting: String = "Hello"
) {
    for (name in names) {
        println("$greeting, $name!")
    }
}

fun main() {
    createGreeting("John", "Jane") // Uses default greeting
    createGreeting("Bob", greeting = "Hi") // Custom greeting
}

此函数将 vararg 参数与默认参数结合使用。第一个调用使用默认的问候语,而第二个调用指定了自定义的问候语。请注意问候语参数的命名参数语法。

vararg 的最佳实践

来源

Kotlin vararg 文档

本教程深入介绍了 Kotlin 的 vararg 关键字,展示了如何创建接受可变数量参数的灵活函数。我们探讨了各种场景,包括混合参数、使用展开运算符以及在构造函数中应用 vararg

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有多年的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我拥有超过八年的编程教学经验。

列出 所有 Kotlin 教程