#json #scala #implicit #scala-macros
#json #scala #неявный #scala-macros
Вопрос:
Мне нужно сериализовать в иерархии признаков, запечатанной в формате JSON, которая выглядит примерно так:
sealed trait Foo[T]
case class Bar(x: Int) extends Foo[Int]
case class Baz(s: String) extends Foo[String]
case object Bah extends Foo[Void]
Я использую play-json-variations для этой сериализацииhttps://github.com/julienrf/play-json-variants разветвлено на https://github.com/mavarazy/play-json-variants. Я внес необходимые изменения, или так я думаю 🙂
Подпись макросов следующая:
object Variants {
/**
* @tparam A The base type of a case class hierarchy.
* @return A [[play.api.libs.json.Format]] for the type hierarchy of `A`.
*/
def format[A]: Format[A] = macro Impl.format[A]
Проблема в том, что я не могу понять, для чего должна быть подпись implicit function
.
Я пробовал
implicit def fooFormat[A]() = Variants.format[Foo[A]]
implicit def fooFormat[A <: Foo[A]]() = Variants.format[A]
Но все они жалуются на ошибку параметра типа trait Foo.
Какая правильная подпись для этого?
Комментарии:
1.
A <: Foo[A]
не имеет никакого смысла, потому что если бы у вас былоFoo[Int]
, то вы бы пытались сделатьFormat[Int]
. Параметр типа должен быть больше похожT <: Foo[_]
(не работает), но я не уверен, что макрос справится с этим.2. Не могли бы вы поделиться кодом?
3. Это в github github.com/mavarazy/play-json-variants .