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)
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)