模式匹配参数案例类时的 Scala "does not take parameters"

标签 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
  }
}

我希望这两种情况都失败或两者都起作用。第二种情况的错误是什么意思?是否有语法解构参数案例类?

注意:这里,小写的“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/

相关文章:

scala - 隐式宏和黑盒宏

scala - 是否可以根据用于对数据集进行分区的列的值来动态命名part-XXXX文件?

python - 更改 databricks 笔记本的默认语言

multithreading - 使用汇总的Scala并行频率计算不起作用

scala - HList 中的类型类包含元素?

algorithm - Scala 堆大小异常中的 Euler 23

scala - 打印类型参数的类型

scala - 如何从函数返回 HList 的多个变体?

scala - Spark SQL 过滤多个字段

scala - Scala 中的类型 - 下界