通过为只委托给
Base
解码器:
import cats.syntax.contravariant._
import io.circe.ObjectEncoder, io.circe.generic.semiauto.deriveEncoder
sealed trait Base
case class Foo(i: Int) extends Base
case class Baz(x: String) extends Base
object Base {
implicit val encodeBase: ObjectEncoder[Base] = deriveEncoder
}
object BaseEncoders {
implicit def encodeBaseSubtype[A <: Base]: ObjectEncoder[A] = Base.encodeBase.narrow
}
它工作正常:
scala> import BaseEncoders._
import BaseEncoders._
scala> import io.circe.syntax._
import io.circe.syntax._
scala> Foo(10000).asJson.noSpaces
res0: String = {"Foo":{"i":10000}}
scala> (Foo(10000): Base).asJson.noSpaces
res1: String = {"Foo":{"i":10000}}
encodeBaseSubtype
无法在中定义
底座
deriveEncoder
宏,导致循环定义(和堆栈溢出等)。我想我想出了一种解决这个问题的方法,在某个时候,我会尝试找到它,并把它作为另一个答案,如果我这样做。