В Скале, У меня есть следующие черты и классы определены (имена, используемые только для целей иллюстрации):Scala - игра JSON черта сериализации
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()
}
В то время как экземпляры класса создаются путем анализа ответа от веб-службы REST API.
Несмотря на то, что подход, использующий библиотеку play-json, работает в случае разбора ответа и возвращает представление класса ответа, я боролся со следующим: наличие универсальной функции, принимающей параметр типа, тогда как T : Entity, и возвращает экземпляр типа T.
для примера рассмотрим следующее:
def parse[T <: Entity](json : String) : Option[T] = Json.parse(json).asOpt[T](Variants.format[T])
Учитывая тип T, я хотел бы разобрать строку JSON и произвести экземпляр типа T, тогда как экземпляр является производным от объекта 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])
^
Поэтому я был бы признателен за помощь!
Благодаря
Хотя проблема действительно, есть еще одна точка слева: каждый раз, когда вам нужно разобрать экземпляр типа Entity , то есть либо X, либо Y-экземпляры, вам необходимо явно указать формат или читать, что именно то, чего я пытался избежать. Скорее, я ищу следующее: parse [X] (jsonString), тогда как сериализатор должен быть определен в функции синтаксического анализа. – dsafa
@dsafa См. Обновление. – Archeg
@dsafa И обратите внимание, что вам не нужно явно указывать формат. В первом примере формат предоставляется неявно, поэтому ключевое слово – Archeg