You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin子类构造器重写抽象val报错原因咨询

问题解析与解决方案

为什么代码报错?

父类BobaTea中的abstract val sweetness: Int是只读抽象属性,子类必须显式提供它的实现。你写的代码里,MatchaBobaLatte根本没重写这个属性——既没在类中声明override val sweetness,也没通过构造器绑定实现。次构造器里的this.sweetness = sweetness本质是试图给一个未定义的只读属性赋值,所以编译器抛出“val cannot be reassigned”错误。

正确实现方式

方式一:主构造器直接重写(最简洁)

直接在主构造器中通过override val绑定构造参数,运行时传入的值会直接作为抽象属性的实现:

class MatchaBobaLatte(override val sweetness: Int) : BobaTea()

方式二:次构造器配合属性初始化

如果需要在次构造器中添加额外逻辑,可以先在类中声明重写的属性,再在构造器中初始化:

class MatchaBobaLatte : BobaTea {
    override val sweetness: Int

    constructor(sweetness: Int) {
        this.sweetness = sweetness
    }
}

方式三:主构造器+次构造器组合

如果需要多个构造入口,可将主构造器设为私有,通过次构造器调用并添加逻辑:

class MatchaBobaLatte private constructor(override val sweetness: Int) : BobaTea() {
    constructor(sweetness: Int) : this(sweetness) {
        // 这里可以添加额外的构造初始化逻辑
    }
}

内容的提问来源于stack exchange,提问作者kranberry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:50:39