Scala 模式匹配 class 类型参数

Scala pattern match with type parameter of type class

sealed trait FormField
case class StringField(name: String, value: String) extends FormField
case class ChoiceField[T : Writes](name: String, value: T, choices: List[T]) extends FormField

然后,我需要在其他地方执行此操作:

def makeJson(fields: List[FormField]) = fields.map {
   case StringField(name, value) => Json.obj(name -> value)
   case ChoiceField(name, value, _) => Json.obj(name -> value)
}

在最后一个函数中,scalac/sbt 不会 "understand" value 可以转换为 json(通过其隐式/类型 class Writes[T]).我怎样才能写得 "gets it"?

(注意:Writes[T] 来自 Play Framework - 它基本上表示类型 T => JsValue 有一个隐式转换可用)

您的问题是,当您进行模式匹配时,Writes 隐式不在范围内;最简单的解决方案是保留对它的显式引用,以便您可以在需要时使用它。这样你的 class 定义就变成了这样的:

case class ChoiceField[T](name: String, value: T, choices: List[T])(implicit val writes: Writes[T]) extends FormField

你的模式匹配:

case cf @ ChoiceField(name, value, _) =>
  implicit val tWrites = cf.writes
  Json.obj(name -> value)