Scala 泛型隐式 val
Scala generic implicit val
我的程序中有很多枚举到 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)
}
但这是不可能的。有什么想法吗?
首先,您误解了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
类型绑定到object
(State.value
),你不能创建generic implicits 所有 Enumeration
.
我的程序中有很多枚举到 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)
}
但这是不可能的。有什么想法吗?
首先,您误解了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
类型绑定到object
(State.value
),你不能创建generic implicits 所有 Enumeration
.