【发布时间】:2020-09-30 04:38:00
【问题描述】:
我正在与 Circe 图书馆合作,并想学习其中的技巧。考虑以下代码:
import io.circe.generic.auto._
import io.circe.syntax._
import io.circe.{Decoder, Encoder, Json}
sealed trait Something
case class Name(val name: String) extends Something
class myClass[T](name: Option[Name] = None, data: Option[Seq[T]] = None) {
// convert an arbitrary sequence to json
def seqToJson[T](lst: Seq[T])(implicit encoder: Encoder[T]): Json = {
lst.asJson
}
val mydata: Json = seqToJson(data.get)
}
object Trace extends App {
val name = new myClass(Some(Name("Noob")))
}
从这里的优秀答案开始:Link,我现在正在尝试一个可以将编码器构建到类中的示例。
但是当我运行上面的代码时,它说:
找不到参数编码器的隐含值: io.circe.Encoder[T] [error] val mydata: Json = seqToJson(data.get) [错误] ^
现在我的问题是,为什么会这样。当我把隐式编码器的定义移到类里面的时候,为什么编译器不知道怎么用呢?
我也尝试了其他方法,即移动到我定义隐式编码器的位置:
import io.circe.generic.auto._
import io.circe.syntax._
import io.circe.{Decoder, Encoder, Json}
sealed trait Something
case class Name(val name: String) extends Something
class myClass[T](name: Option[Name] = None, data: Option[Seq[T]] = None)(implicit encoder: Encoder[T]) {
// convert an arbitrary sequence to json
def seqToJson[T](lst: Seq[T]): Json = {
lst.asJson
}
val mydata: Json = seqToJson(data.get)
}
object Trace extends App {
val name = new myClass(Some(Name("Noob")))
}
这会产生以下错误:
找不到参数编码器的隐含值:io.circe.Encoder[Seq[T]] 模棱两可的隐含值:
[error] both lazy value encodeDuration in object Encoder of type io.circe.Encoder[java.time.Duration]
[error] and lazy value encodeInstant in object Encoder of type io.circe.Encoder[java.time.Instant]
[error] match expected type io.circe.Encoder[T]
[error] Error occurred in an application involving default arguments.
[error] val name = new myClass(Some(Name("Noob")))
所以我的问题是,如何将隐式定义的编码器纳入类的范围。任何解释理论的答案将不胜感激!
编辑:使用了 Ivan 的结构,并且有效!
import io.circe.syntax._
import io.circe.{Decoder, Encoder, Json}
class myClass[T](data: Seq[T])(implicit encoder: Encoder[T]) {
def seqToJson(lst: Seq[T]): Json = {
lst.asJson
}
}
object Trace extends App {
println(new myClass[Int](data = Seq(1,2,3)))
}
【问题讨论】:
标签: scala generics types shapeless circe