【发布时间】:2016-07-26 01:54:15
【问题描述】:
在 scala 中,我定义了以下特征和类(名称仅用于说明目的):
trait Entity {
def x() : Collection
}
case class X(x : Int, y : Int) extends Entity {
def x() : Collection = XCollection()
}
case class Y(x : Int, y : Int) extends Entity {
def x() : Collection = YCollection()
}
虽然类实例是通过解析来自 Web 服务 REST API 的响应来创建的。
虽然使用 play-json 库的方法在解析响应并返回响应的类表示的情况下有效,但我一直在努力解决以下问题:让泛型函数采用类型参数,而 T :实体,并返回 T 类型的实例。
例如,考虑以下情况:
def parse[T <: Entity](json : String) : Option[T] = Json.parse(json).asOpt[T](Variants.format[T])
给定一个类型 T,我想解析 JSON 字符串并生成一个类型 T 的实例,而该实例是 trait Entity 的派生。但是,我不断收到关于反射 API 的编译错误:
Error:(25, 96) exception during macro expansion:
scala.ScalaReflectionException: type T is not a class
at scala.reflect.api.Symbols$SymbolApi$class.asClass(Symbols.scala:323)
at scala.reflect.internal.Symbols$SymbolContextApiImpl.asClass(Symbols.scala:73)
at julienrf.variants.Variants$Impl$.baseAndVariants(Variants.scala:132)
at julienrf.variants.Variants$Impl$.formatDiscriminator(Variants.scala:99)
at julienrf.variants.Variants$Impl$.format(Variants.scala:94)
def parse[T <: Entity](json : String) : Option[T] = Json.parse(json).asOpt[T](Variants.format[T])
^
因此,我将不胜感激!
谢谢
【问题讨论】:
标签: json scala serialization playframework