この記事 で説明されているように、ケースクラスを作成しようとしています。
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でケースツーケースの継承が禁止されている理由 )。ここでの代替方法は何ですか?
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
^
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
_