【发布时间】:2018-04-08 18:07:17
【问题描述】:
我正在尝试为一个抽象类编写一个 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 设置为任何适用的案例类。
【问题讨论】:
-
animalFormat的(t: T)参数有必要吗?如果删除它会怎样? -
如果我删除它,我仍然会收到同样的错误...
标签: scala generics spray-json