Что такое подпись для неявной универсальной функции, которая использует макросы Scala для генерации

#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 .