我正在尝试为 Json4s 编写一个通用的自定义序列化程序,它可以处理类型为 T <: Enum[T] 的 Java 枚举。为此,我想使用 Enum.valueOf 方法,该方法也采用 T <: Enum[T] 类型的类标记。这是我到目前为止所拥有的:
class EnumSerializer[T <: Enum[T]](implicit m: Manifest[T]) extends Serializer[T] {
val enumerationClass: Class[_ <: Enum[T]] = m.runtimeClass.asInstanceOf[Class[T]]
def deserialize(implicit format: Formats) : PartialFunction[(TypeInfo, JValue), T] = {
case (t @ TypeInfo(enumerationClass, _), json) => {
json match {
case JString(value) => Enum.valueOf(enumerationClass, value.toUpperCase()).asInstanceOf[T]
case value => throw new MappingException(s"Can't convert $value to $enumerationClass")
}
}
}
def serialize(implicit format: Formats): PartialFunction[Any, JValue] = {
case i : Enum[T] => JString(i.name())
}
}
但我收到以下编译错误:
inferred type arguments [_0] do not conform to method valueOf's type parameter bounds [T <: Enum[T]]
case JString(value) => Enum.valueOf(enumerationClass, value.toUpperCase()).asInstanceOf[T]
我不知道如何让 enumerationClass 具有正确的类型。