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

Scala中case object如何继承多层抽象类?代码报错怎么修复?

修复Scala多层抽象类继承的case object错误

错误原因

你遇到的问题是:初始化case object Foo时,调用父类B(a)构造器的时机早于子类内部val a = 5的定义,编译器此时找不到a的值;同时原代码中抽象类A、B的构造器参数未加val修饰,属于私有成员,子类无法继承访问。

修复方案

因为case object是单例实例,属性值固定,直接将常量值5传入父类B的构造器即可。同时给抽象类的构造器参数添加val,让子类能继承访问该属性:

object Main {
  sealed abstract class A(val a: Int)
  sealed abstract class B(val a: Int) extends A(a)

  // 直接传入固定值5给B的构造器,子类可继承B的a属性
  case object Foo extends B(5)

  case class Bar(a: Int) extends A(a)
}

如果确实需要在Foo内部显式重写a(实际没必要,因为值固定),可以这样写:

case object Foo extends B(5) {
  override val a = 5
}

补充说明

  • 抽象类构造器参数加val后,会成为类的公有成员变量,子类可直接继承使用。
  • case object是单例,无法像case class那样接收外部参数,因此父类构造器必须传入固定常量。

内容的提问来源于stack exchange,提问作者The Unfun Cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:27:03