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
相关产品推荐
相关产品推荐

