我有以下代码:
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',则检查器将在方法的类型参数中查找它.
当你这样做时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参数位于方法调用上,而不是在对象上.
| 归档时间: |
|
| 查看次数: |
2842 次 |
| 最近记录: |