如果禁止案例类继承,如何表示?

Ara*_*ram 9 scala algebraic-data-types

我正在尝试创建本文中解释的案例类

sealed abstract case class Exp()
case class Literal(x:Int) extends Exp
case class Add(a:Exp, b:Exp) extends Exp
case class Sub(a:Exp,b:Exp) extends Exp
Run Code Online (Sandbox Code Playgroud)

但是,我在IntelliJ中收到以下错误.我理解为什么禁止它(为什么在Scala中禁止逐案继承).这里的替代方式是什么?

Error:(2, 13) case class Literal has case ancestor A$A34.A$A34.Exp, but case-to-case inheritance is prohibited. To overcome this limitation, use extractors to pattern match on non-leaf nodes.
case class Literal(x:Int) extends Exp
           ^
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 22

Exp不应该使用case关键字.也就是说sealed abstract case class,如果有的话很少使用它.

在这种特殊情况下,你得到的唯一额外的东西sealed abstract case class Exp()是自动生成的同伴对象Exp有一个unapply方法.并且这种unapply方法不会非常有用,因为没有任何东西可以从泛型中提取Exp.也就是说,你只关心分解Add,Sub等等.

这很好:

sealed abstract class Exp

case class Literal(x: Int) extends Exp

case class Add(a: Exp, b: Exp) extends Exp

case class Sub(a: Exp, b: Exp) extends Exp
Run Code Online (Sandbox Code Playgroud)