gpt4 book ai didi

scala - 具有泛型参数的抽象类的 JsonFormat

转载 作者:行者123 更新时间:2023-12-04 06:38:52 26 4
gpt4 key购买 nike

我正在尝试为抽象类编写一个 JsonFormat,它的通用参数看起来像这样:

abstract class Animal[A] {
def data: A
def otherStuff: String = "stuff"
}
case class CatData(catField: String)
case class Cat(data: CatData) extends Animal[CatData]

到目前为止,我的尝试是这样的:

object AnimalProtocol extends DefaultJsonProtocol {

implicit val catDataFormat = jsonFormat1(CatData)
implicit val catFormat = jsonFormat1(Cat)

implicit def animalFormat[T <: Animal[T]](t: T)(implicit fmt: JsonWriter[T]) = new RootJsonFormat[Animal[T]] {
def write(obj: Animal[T]) = obj match {
case x: Cat => catFormat.write(x)
}

def read(json: JsValue) = ???
}

现在,如果我尝试这样做:

import AnimalProtocol._
val cat: Animal[CatData] = Cat(CatData("this is cat data"))

我得到编译器错误:

Cannot find JsonWriter or JsonFormat type class for Animal[CatData]

我怎样才能让它发挥作用?最后,我想用 Animal 中的字段编写 json,并将 data 设置为适用的任何案例类。

最佳答案

您需要在implicit def 中为通用字段和Animal 的子类提供类型参数:

object AnimalProtocol2 extends DefaultJsonProtocol {

implicit val catDataFormat = jsonFormat1(CatData)

implicit def animalFormat[A, T <: Animal[A]](implicit fmt: JsonWriter[A]): RootJsonFormat[T] = new RootJsonFormat[T] {
def write(obj: T) = {
JsObject(
"data" -> obj.data.toJson,
"otherStuff" -> obj.otherStuff.toJson
)
}

def read(json: JsValue) = ???
}
}

这还允许您摆脱 animalFormat 中子类的模式匹配。

关于scala - 具有泛型参数的抽象类的 JsonFormat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46969888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com