使用默认参数调用覆盖的方法

时间:2018-11-18 10:06:17

标签: kotlin

在我的Kotlin项目中,我遇到以下情况:

abstract class BaseConverter<T> {
    abstract fun serializeValue(output: ByteArray, value: T, offset: Int = 0): Int
}

object BooleanConverter: BaseConverter<Boolean>() {
    override fun serializeValue(output: ByteArray, value: Boolean, offset: Int): Int {
        output[0 + offset] = if(value) 1.toByte() else 0.toByte()
        return 1
    }
}

现在从我的测试用例中,我尝试调用BooleanConverter.serializeValue(array, value),它没有给我IDE错误消息。但是,当我尝试运行测试时,出现以下错误:

  

由以下原因引起:org.jetbrains.kotlin.codegen.CompilationException:后端(JVM)内部错误:生成的代码错误[...] AnalyzerException:参数3:预期为R,但找到了我

当我将通话更改为BooleanConverter.serializeValue(array, value, 0)时,一切正常。但这使我的默认值变得不必要。由于以下原因,我也无法添加默认值:

  

不允许覆盖函数为其参数指定默认值

那为什么我不能只用两个参数来调用该方法,有什么方法可以解决这个问题?

1 个答案:

答案 0 :(得分:2)

您只能将默认参数与父类类型的变量一起使用(在该方法中声明具有默认参数的方法)。解决方法:

val c: BaseConverter<Boolean> = BooleanConverter
c.serializeValue(array, value)

或不创建额外变量:

(BooleanConverter as BaseConverter<Boolean>).serializeValue(array, value)