我的Scanamo
将放有任何对象进行通用DynamoFormat
Circe
的Encoder
和Decoder
定义到数据库作为一个JSON字符串。堆栈溢出类型类与隐式转换
import com.gu.scanamo.DynamoFormat
import io.circe.parser.parse
import io.circe.syntax._
import io.circe.{Decoder, Encoder}
object JsonDynamoFormat {
def forType[T: Encoder: Decoder]: DynamoFormat[T] = DynamoFormat.coercedXmap[T, String, Exception] {
s => parse(s).flatMap(_.as[T]).fold(err => throw err, obj => obj)
} {
obj => obj.asJson.noSpaces
}
}
然后我添加了一个隐式转换(与object JsonDynamoFormat
相同)以自动提供这些格式化程序。
implicit def jsonToFormat[T: Encoder: Decoder]: DynamoFormat[T] = JsonDynamoFormat.forType[T]
当我将其导入,编译器将解析格式化成功,但在运行时我得到了JsonDynamoFormat
堆栈溢出,其中调用jsonToFormat
和forType
备用无限:
Exception in thread "main" java.lang.StackOverflowError
at JsonDynamoFormat$.forType(JsonDynamoFormat.scala:12)
at JsonDynamoFormat$.jsonToFormat(JsonDynamoFormat.scala:9)
at JsonDynamoFormat$.forType(JsonDynamoFormat.scala:13)
at JsonDynamoFormat$.jsonToFormat(JsonDynamoFormat.scala:9)
...
我真的不能明白这里发生了什么。任何人都可以阐明这一点吗?
我不知道会发生什么,如果你让'def forType'隐式并移除'implicit def jsonToFormat'。看起来第二个是非常多余的。 – Haspemulator
@Haspemulator,有趣的是它无法编译,虽然函数签名确实看起来是一样的。奇怪的。 –
我认为这种失败是解决问题根源的关键。启用'scalacOptions ++ = Seq(“ - Xlog-implicits”)'获得隐式解析日志(可能是很多输出),并且可以选择'libraryDependencies ++ = Seq(compilerPlugin(“io.tryp”%%“ splain“%”0.2.4“))'使输出更好。这可能有助于解释为什么隐式未找到。 – Haspemulator