如何将 vararg 作为数组传递给 Kotlin 函数?
How to pass vararg as array to function in Kotlin?
我想将可变参数从购买功能传递到驱动功能
但我得到
编译错误:
required Array<T> found Array<out T>
代码:
class Car
fun buy(vararg cars: Car) {
drive(cars) //compile error
}
fun drive(cars: Array<Car>) {
//...
}
本质上,您需要在变量名之前使用 vararg 关键字。
fun args(vararg cars: Car) {
//use cars as an array
}
精确误差为:
Type mismatch.
Required: Array<Car>
Found: Array<out Car>
问题是当你有一个 vararg cars: Car
函数参数时,它在函数内部的类型是 Array<out Car>
,它基本上代表一个只读的参数数组,函数被调用时使用 -毕竟,开始修改作为 vararg
获得的参数并不是一件好事(Kotlin 中的函数参数是只读的 val
s,这非常相似)。
但是您的 drive
函数需要一个常规的 Array<Car>
,这当然也是可写的。因此,如果您希望保留这些函数签名,则需要创建一个新数组,其中包含只读数组中的所有内容。这可以使用以下语法创建:
drive(arrayOf(*cars))
这调用了我们通常用来创建数组的 arrayOf
函数,它接受一个可变参数,并使用扩展运算符,这是一种传入数组元素的方法(cars
是,在 buy
函数内)作为可变参数 (docs here).
虽然这一切听起来很复杂,但它实际上是一个非常有效的解决方案,因为它只是在字节码的幕后使用 Array.copyOf
。
另一个解决方案是将 drive
更改为 fun drive(Array<out Car>) { ... }
。这当然意味着驱动器内的车不能修改,但避免了复制。
override fun checkMatch(vararg cards: SetsCard): Int {
return if (isSet(*cards)) 16 else -2
}
private fun isSet(vararg cards: SetsCard) : Boolean {
if (cards.size == 3) {
return true
}
return false
}
fun foo(vararg strings: String): Array<out String> {
return strings
}
// Define a var
var yourVar: Array<out String> = foo("a", "b", "c")
// Use var in Java method `public void javaMethod(String... someParam)() {}`
javaMethod(*yourVar)
我想将可变参数从购买功能传递到驱动功能 但我得到
编译错误:
required Array<T> found Array<out T>
代码:
class Car
fun buy(vararg cars: Car) {
drive(cars) //compile error
}
fun drive(cars: Array<Car>) {
//...
}
本质上,您需要在变量名之前使用 vararg 关键字。
fun args(vararg cars: Car) {
//use cars as an array
}
精确误差为:
Type mismatch.
Required: Array<Car>
Found: Array<out Car>
问题是当你有一个 vararg cars: Car
函数参数时,它在函数内部的类型是 Array<out Car>
,它基本上代表一个只读的参数数组,函数被调用时使用 -毕竟,开始修改作为 vararg
获得的参数并不是一件好事(Kotlin 中的函数参数是只读的 val
s,这非常相似)。
但是您的 drive
函数需要一个常规的 Array<Car>
,这当然也是可写的。因此,如果您希望保留这些函数签名,则需要创建一个新数组,其中包含只读数组中的所有内容。这可以使用以下语法创建:
drive(arrayOf(*cars))
这调用了我们通常用来创建数组的 arrayOf
函数,它接受一个可变参数,并使用扩展运算符,这是一种传入数组元素的方法(cars
是,在 buy
函数内)作为可变参数 (docs here).
虽然这一切听起来很复杂,但它实际上是一个非常有效的解决方案,因为它只是在字节码的幕后使用 Array.copyOf
。
另一个解决方案是将 drive
更改为 fun drive(Array<out Car>) { ... }
。这当然意味着驱动器内的车不能修改,但避免了复制。
override fun checkMatch(vararg cards: SetsCard): Int {
return if (isSet(*cards)) 16 else -2
}
private fun isSet(vararg cards: SetsCard) : Boolean {
if (cards.size == 3) {
return true
}
return false
}
fun foo(vararg strings: String): Array<out String> {
return strings
}
// Define a var
var yourVar: Array<out String> = foo("a", "b", "c")
// Use var in Java method `public void javaMethod(String... someParam)() {}`
javaMethod(*yourVar)