如果禁止使用case class继承,该如何表示?

19

我正在尝试按照这篇文章中所述的方式创建案例类。

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中我遇到了以下错误。我理解为什么这是被禁止的(为什么Scala中不允许case-to-case继承)。在这里有什么替代方法吗?

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个回答

32

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接