Если наследование класса case запрещено, как это представить?

Я пытаюсь создать классы case, как описано в эта статья

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
           ^

person Aravind Yarram    schedule 08.02.2016    source источник


Ответы (1)


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
person Michael Zajac    schedule 08.02.2016