1

私は Scala 2.10 を使用しており、Java 列挙型の逆シリアル化のための一般的な方法に従うのに苦労しています。

class FromEnumFormat[T<: Enum[T]] extends JsonFormat[T] {

  import scala.reflect._
  implicit val m = classTag[T]

  override def read(json: JsValue): T = {

    val EnumerationClass  = m.runtimeClass.asInstanceOf[Class[T]]

    json match {
      case s :JsString if EnumerationClass.getEnumConstants.map(_.toString.toLowerCase).contains(s) => Enum.valueOf(EnumerationClass ,s.value.toUpperCase()).asInstanceOf[T]
      case unknown => deserializationError(s"unknown Status: ${unknown}")
    }
  }

  override def write(obj: T): JsValue = {JsString(obj.name().toLowerCase)}
}

私が得ているエラーメッセージは次のとおりです。

 No ClassTag available for T

これは明らかですが、正しく解決する方法がわかりません。誰かが私にヒントを与えることができますか?

4

1 に答える 1

1

これで問題が解決するはずです

class FromEnumFormat[T<: Enum[T]: ClassTag] extends JsonFormat[T] {

  import scala.reflect._
  val m = classTag[T]

  override def read(json: JsValue): T = {

    val EnumerationClass  = m.runtimeClass.asInstanceOf[Class[T]]

    json match {
      case s :JsString if EnumerationClass.getEnumConstants.map(_.toString.toLowerCase).contains(s) => Enum.valueOf(EnumerationClass ,s.value.toUpperCase()).asInstanceOf[T]
      case unknown => deserializationError(s"unknown Status: ${unknown}")
    }
  }

  override def write(obj: T): JsValue = {JsString(obj.name().toLowerCase)}
}
于 2015-09-18T12:43:54.407 に答える