`error:对象B不是case类` - 但是`B`是一个case类

时间:2015-12-29 20:36:09

标签: scala

给出两种代数数据类型:AFoo

scala> sealed trait A
defined trait A

scala> case object B extends A
defined object B

scala> sealed trait Foo
defined trait Foo

scala> case class FooImpl(x: Int) extends Foo
defined class FooImpl

一个简单的函数f

scala> def f: Foo = FooImpl(5)
f: Foo

最后,我有几个嵌套的match语句/表达式:

scala> def hoobar(x: A): Int = x match {
     |            case B(_) => f match {
     |              case FooImpl(_) => ???
     |            }
     |           }
<console>:18: error: object B is not a case class, nor does it have an unapply/unapplySeq member
                  case B(_) => f match {
                       ^

为什么会出现上述错误? B肯定是case class,不是吗?

1 个答案:

答案 0 :(得分:3)

B(_)是一个案例对象,而不是案例类。 _没有意义。当只有一个对象B时,B会替代什么?

如果你想在case B => ... 上匹配一个特定的对象,请使用(如果是小写则需要后退):

unapply

虽然可以通过为B提供case object B extends A { def unapply(b: this.type): Option[this.type] = Some(b) } 方法来使其他语法工作,但它实际上并没有用。

{{1}}