2017-08-12 36 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 

}