web-dev-qa-db-ja.com

ケースクラスの継承が禁止されている場合、これをどのように表現しますか?

この記事 で説明されているように、ケースクラスを作成しようとしています。

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
           ^
12
Aravind Yarram

Expcaseキーワードを使用しないでください。つまり、_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
_
21
Michael Zajac