我正在尝试按照this article
中的说明创建案例类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
但是,我在IntelliJ中收到以下错误。我明白为什么禁止它(Why case-to-case inheritance is prohibited in 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
^
答案 0 :(得分:18)
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