特征类型参数的隐式编码器
Implicit encoder for a trait type parameter
我想使用 argonaut 库将类型为 List[E]
的字段编码为 json。
sealed trait Msg[E] {
val contents: List[E]
def send(): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
然后我有一个 StringMsg
案例 class:
case class StringMsg(contents: List[String]) extends Msg[String]
argonaut 库定义了 JsonIdentity[J]
特性:
trait JsonIdentity[J] {
val j: J
/**
* Encode to a JSON value using the given implicit encoder.
*/
def jencode(implicit e: EncodeJson[J]): Json =
e(j)
}
当我创建 StringMsg
的新实例并调用 send()
方法时,出现以下错误:
StringMsg(List("a","b")).send()
could not find implicit value for parameter e:
argonaut.EncodeJson[List[E]]
您的 API 应该要求来自客户端代码的隐式 argonaut.EncodeJson[List[E]]
:
sealed trait Msg[E] {
val contents: List[E]
implicit def encodeJson: argonaut.EncodeJson[List[E]] //to be implemented in subclass
def send(): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
//or
abstract class Msg[E](implicit encodeJson: argonaut.EncodeJson[List[E]]) {
val contents: List[E]
def send(): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
//or
sealed trait class Msg[E] {
val contents: List[E]
def send()(implicit encodeJson: argonaut.EncodeJson[List[E]]): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
客户端代码中的某处:
case class StringMsg(contents: List[String]) extends Msg[String] {
implicit val encodeJson = argonaut.StringEncodeJson
}
//or
import argonaut.StringEncodeJson //or even import argonaut._
case class StringMsg(contents: List[String]) extends Msg[String]() //implicit will be passed here
//or
import argonaut.StringEncodeJson //or even import argonaut._
case class StringMsg(contents: List[String]) extends Msg[String]
val a = StringMsg(Nil)
a.send() //implicit will be passed here
我想使用 argonaut 库将类型为 List[E]
的字段编码为 json。
sealed trait Msg[E] {
val contents: List[E]
def send(): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
然后我有一个 StringMsg
案例 class:
case class StringMsg(contents: List[String]) extends Msg[String]
argonaut 库定义了 JsonIdentity[J]
特性:
trait JsonIdentity[J] {
val j: J
/**
* Encode to a JSON value using the given implicit encoder.
*/
def jencode(implicit e: EncodeJson[J]): Json =
e(j)
}
当我创建 StringMsg
的新实例并调用 send()
方法时,出现以下错误:
StringMsg(List("a","b")).send()
could not find implicit value for parameter e: argonaut.EncodeJson[List[E]]
您的 API 应该要求来自客户端代码的隐式 argonaut.EncodeJson[List[E]]
:
sealed trait Msg[E] {
val contents: List[E]
implicit def encodeJson: argonaut.EncodeJson[List[E]] //to be implemented in subclass
def send(): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
//or
abstract class Msg[E](implicit encodeJson: argonaut.EncodeJson[List[E]]) {
val contents: List[E]
def send(): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
//or
sealed trait class Msg[E] {
val contents: List[E]
def send()(implicit encodeJson: argonaut.EncodeJson[List[E]]): Unit = {
val json = contents.asJson
println("Sending json: " + json.toString())
}
}
客户端代码中的某处:
case class StringMsg(contents: List[String]) extends Msg[String] {
implicit val encodeJson = argonaut.StringEncodeJson
}
//or
import argonaut.StringEncodeJson //or even import argonaut._
case class StringMsg(contents: List[String]) extends Msg[String]() //implicit will be passed here
//or
import argonaut.StringEncodeJson //or even import argonaut._
case class StringMsg(contents: List[String]) extends Msg[String]
val a = StringMsg(Nil)
a.send() //implicit will be passed here