Scala泛型隐式val

时间:2017-08-17 10:50:03

标签: scala generics implicit

我的程序中有很多用于枚举json变换的隐式val:

implicit val format = new Format[AuthRoleIndividual] {
    def reads(json: JsValue) = JsSuccess(AuthRoleIndividual.withName(json.as[String]))
    def writes(myEnum: AuthRoleIndividual) = JsString(myEnum.toString)
  }

注意:AuthRoleIndividual扩展Enumeration。我的方法是写这样的东西:

implicit val format[T <: Enumeration] = new Format[T] {
    def reads(json: JsValue) = JsSuccess(T.withName(json.as[String]))
    def writes(myEnum: T) = JsString(myEnum.toString)
  }

但那是不可能的。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

首先,您误解Enumeration值的类型,对于Enumeration值,的类型为Value输入不是Enumeration,因此您应该绑定implicit类型的Value。例如:

  object State extends Enumeration {
    val A = Value("A")
    val B = Value("B")
  }

  implicit def foo(v: State.Value): String = v.toString + "-Bar"

  val t: String = State.A

其次,如上面的代码所示,由于Value类型绑定到objectState.value),因此您无法创建通用含义适用于所有Enumeration