我正在嘗試爲可以處理Java枚舉的Json4s編寫一個通用自定義序列化程序,該枚舉類型爲T <:Enum [T]。要做到這一點,我想使用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有正確的類型。
謝謝,我甚至沒有意識到大寫字母的變量名稱意味着什麼在斯卡拉。我在原始代碼(基於別人寫的不太通用的東西)中確實擁有它,但認爲它只是奇怪的風格,所以我在添加通用部分之前對其進行了更改,然後想知道爲什麼它不起作用。 – Ryan