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

时间:2016-02-08 01:23:45

标签: scala algebraic-data-types

我正在尝试按照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
           ^

1 个答案:

答案 0 :(得分:18)

Exp不应使用case关键字。也就是说,sealed abstract case class很少(如果有的话)使用有意义。

在这种特定情况下,您从sealed abstract case class Exp()获得的唯一额外内容是具有Exp方法的自动生成的伴随对象unapply。这个unapply方法不会非常有用,因为没有任何内容可以从通用Exp中提取。也就是说,您只关心分解AddSub

这很好:

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