Scala无形隐式解决方案StackOverflowError与ArgonautShapeless

时间:2017-06-29 10:42:33

标签: scala shapeless argonaut argonaut-shapeless

我使用ArgonautShapeless来定义一些json编解码器。

当我为我的编解码器提供类型时,我得到了StackOverflowError,但如果我将该类型保留为关闭它就可以了。我该如何提供类型?

我对这个问题的理解是def of[A: DecodeJson] = implicitly[DecodeJson[A]]的隐式查找在同一行implicit def fooCodec: DecodeJson[Foo]找到了我的定义,因此是递归的,所以中断。

还有其他一些方法可以让我提供这种类型吗?理想情况下,我希望在我的项目中有一个对象,我定义所有代码,它们可能相互依赖。

import $ivy.`com.github.alexarchambault::argonaut-shapeless_6.2:1.2.0-M4` 
import argonaut._, Argonaut._ 
case class Foo(a: Int)
object SomeCodecs {
    import ArgonautShapeless._
    // this doesnt work
    implicit def fooCodec: DecodeJson[Foo] = DecodeJson.of[Foo]
 } 
import SomeCodecs._
"""{"a":1}""".decode[Foo]

java.lang.StackOverflowError
  ammonite.$sess.cmd3$SomeCodecs$.fooCodec(cmd3.sc:3)

如果我关掉这个类型,它会起作用。

object SomeCodecs {
    import ArgonautShapeless._
    // this works
    implicit def fooCodec = DecodeJson.of[Foo]
 } 
import SomeCodecs._
"""{"a":1}""".decode[Foo]
res4: Either[Either[String, (String, CursorHistory)], Foo] = Right(Foo(1))

由于

0 个答案:

没有答案