2017-08-12 35 views
1

一般我很少有case类与exacly同样DEF:圈JSON的特质

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

最简单的方式来实现你想要的很简单,就是将隐式约束移至您的方法并摆脱您的其他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 

}