我有以下代码:
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
}
}
我希望这两种情况都失败或两者都起作用。第二种情况的错误是什么意思?是否有语法解构参数案例类?
注意:这里,小写的“t”是必不可少的。如果它是“T”,检查器将在方法的类型参数中寻找它。
最佳答案
当你这样做 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)
.请注意,类型参数在方法调用上,而不是在对象上。
关于模式匹配参数案例类时的 Scala "does not take parameters",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23376194/