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)
| 归档时间: |
|
| 查看次数: |
8228 次 |
| 最近记录: |