当模式匹配参数化案例类时,Scala"不接受参数"

com*_*mco 6 scala

我有以下代码:

sealed trait A

case class B[T](v: T) extends A
case class C[T](v: T) extends A

object Test {
  def swap(a: A): A = a match {
    case a: B[t] => C[t](a.v) // works!
    case C[t](v) => B[t](v) // error: C[t] does not take parameters
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这两种情况都会失败,或者两种情况都会发生.第二种情况下错误的含义是什么?是否有语法解构参数化案例类?

注意:这里,小写't'是必不可少的.如果它是'T',则检查器将在方法的类型参数中查找它.

Kar*_*l S 6

当你这样做时a match { case C(v) => ??? },你实际上调用unapply了C伴随对象的方法,如下所示:C.unapply(a) match {Some(v) => ???}

只有一个C对象,而不是整个家庭C[t].没有你可以参考的对象C[Int],所以case C[t](v) =>没有意义.

在您的示例中,您使用的B[t]是类型,而不是模式,这就是它的工作原理.请注意,虽然匹配可能会成功,但t由于类型擦除,您将无法获得任何内容.

当你调用时C[t](a.v),首先,编译器会删除类型t,其次,这会被重写为apply对伴随对象上方法的调用:C.apply[t](a.v).请注意,type参数位于方法调用上,而不是在对象上.