Scala模式与类型的类型参数匹配

时间:2015-10-16 13:43:06

标签: scala playframework-2.0 pattern-matching implicit-conversion typeclass

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没有理解" value可转换为json(通过其隐式/类型类Writes[T])。我该如何写它以便它能够得到它?#/ p>

(注意:Writes[T]来自Play Framework - 它基本上表示存在类型为T => JsValue的隐式转换

1 个答案:

答案 0 :(得分:3)

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

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)