๋ ์ง์ ๋ํ ์ธ์ฝ๋ฉ์ด ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ถํํฉ๋๋ค.
[error] /home/jilen/workspace/jfc-test/src/main/scala/Foo.scala:26: diverging implicit expansion for type io.circe.Encoder.Secondary[this.Out]
[error] starting with method encodeCaseClass in trait GenericInstances
์ค๋ฅ ๋ณด๊ณ ๋ฅผ ๊ฐ์ ํ ๊ธฐํ๊ฐ ์์ต๋๊น?
import io.circe._
import io.circe.generic.auto._
import io.circe.syntax._
import java.util.Date
case class Foo(
date: Date,
number: Int,
str: String)
object App {
def encodesDate(fmt: String): Encoder[Date] = new Encoder[Date] {
def apply(a: Date) = {
val sdf = new java.text.SimpleDateFormat(fmt)
Json.string(sdf.format(a))
}
}
def main(args: Array[String]) {
//implicit val DateEncodes = encodesDate("yyyy-MM-dd HH:mm:ss")
val f = Foo(new Date, 1, "fff")
println(f.asJson.noSpaces)
}
}
์, ๊ทธ๊ฒ์ ๋งค์ฐ ๋์ฐํ ์ค๋ฅ ๋ฉ์์ง์ ๋๋ค. ์ง์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ผ๋ฐ ํ์ ๋ฉ์ปค๋์ฆ์ ๊ตฌํ์ ๋ด์ผ ์๋ฃ๋๊ธฐ๋ฅผ ํฌ๋งํ๋ #30๊ณผ ํจ๊ป ๋ณ๊ฒฝ๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋จผ์ง๊ฐ ํด๊ฒฐ๋ ํ ์ํฉ์ด ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ด๊ฒ์ ๋ค์ ๋ฐฉ๋ฌธํ๊ณ #34๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๊ฒ ์ต๋๋ค. ์ด๋ฌํ ๋ฉ์์ง๋ฅผ ๋ง์ด ๊ฐ์ ํ๊ธฐ ์ํด ๋ช ๊ณณ์์ @implicitNotFound
๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค(์: Finch์ ์ด ๋ฉ์์ง ์ฐธ์กฐ).
implicitNotFound๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด +1!
๋ ์ง๋ฅผ ๋์ฝ๋ฉํ๊ณ ์ธ์ฝ๋ฉํ๋ ค๋ฉด ์์์
implicit val dateTimeEncoder: Encoder[DateTime] = Encoder.instance(a => a.getMillis.asJson)
implicit val dateTimeDecoder: Decoder[DateTime] = Decoder.instance(a => a.as[Long].map(new DateTime(_)))
๋ ์ง ํ์์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ฌธ์์์ ์ ์ํ๊ณ jfc์ ๊ธฐ๋ณธ ํ์์ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค์์ด ํฌ๊ฒ ๊ฐ์ ๋์์ผ๋ฏ๋ก ๊ณ์ ์งํํ๊ณ ๋ซ๊ฒ ์ต๋๋ค.
<console>:59: error: could not find implicit value for parameter e: io.circe.Encoder[Foo]
println(f.asJson.noSpaces)
^
๋ฌธ์์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๊ณ ์ด ๊ฒฝ์ฐ @implicitNotFound
๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ ์ ์๋ ์ ์ฉํ ์ถ๊ฐ ์ ๋ณด๊ฐ ๋ง์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
implicitNotFound๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด +1!
๋ ์ง๋ฅผ ๋์ฝ๋ฉํ๊ณ ์ธ์ฝ๋ฉํ๋ ค๋ฉด ์์์
๋ ์ง ํ์์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ฌธ์์์ ์ ์ํ๊ณ jfc์ ๊ธฐ๋ณธ ํ์์ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.