如何将vararg传递给Kotlin中的varag函数或构造函数?

Raf*_*cha 17 kotlin

Kotlin不允许我的子类将vararg传递给我的超类构造器这是我的Operation类:

package br.com.xp.operation

import java.util.ArrayList

abstract class Operation(vararg values: Value) : Value {
    protected var values: MutableList<Value> = ArrayList()

    internal abstract val operator: String
}
Run Code Online (Sandbox Code Playgroud)

这是我的SubtractionOperation类:

package br.com.xp.operation

class SubtractionOperation private constructor(vararg values: Value) : Operation(values) {
    override val operator: String
        get() = "-"
}
Run Code Online (Sandbox Code Playgroud)

编译说:

类型不匹配必需值找到数组

任何人都可以解释为什么这是不可能的?

Oli*_*rth 41

来自文档:

在函数内部vararg,类型的参数T作为数组可见T.

所以在SubtractionOperation构造函数中,values确实是一个Array<Value>.您需要使用spread运算符(*)来转发它们:

class SubtractionOperation private constructor(vararg values: Value) : Operation(*values) ...
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是 (IIRC) 这会创建一个新数组。 (4认同)
  • 我相信 https://youtrack.jetbrains.com/issue/KT-20462 修复了这个性能/内存分配问题。1.2-Beta2 包含此修复程序。 (2认同)