我有几个与exacly相同的案例类:
def toJson : String = this.asJson.deepMerge(Json.obj(("type", Json.fromString(`type`)))).noSpaces
我想把这一部分转移到特质上。 例如:
trait Test[A] {
implicit val encoder: Encoder[A]
def jsonWithType[A] = this.asJson.noSpaces
}
但是这当然给我一个错误:
could not find implicit value for parameter encoder: io.circe.Encoder[io.outofaxis.pixelart.player.server.application.model.Test[A]]
是否有可能实现我的目标?
编辑:
我找到了解决办法,在我需要那些jsons的对象中:
implicit def asJsonWithTypeNoSpaces[A <: SomeEvent](obj: A)(implicit encoder: Encoder[A]): String = {
obj.asJson.deepMerge(Json.obj(("type", Json.fromString(obj.`type`)))).noSpaces
}
工作正常
答案 0 :(得分:0)
实现所需内容的最简单方法是将隐式约束移动到您的方法中,并删除其他val
。毕竟你可能已经在某个地方定义了它,为什么强迫不必要的override
?
trait Test[A] {
// Equivalently def jsonWithType[A](implicit encoder: Encoder[A])
def jsonWithType[A : Encoder] = this.asJson.noSpaces
}
如果你真的必须满足你的覆盖需求,你也可以直接传入你的编码器。请记住:可以明确地满足隐式参数。
trait Test[A] {
val encoder: Encoder[A]
def jsonWithType[A] = this.asJson(encoder).noSpaces
}