Play Scala JSON Writes & Inheritance -
//item.scala
package model trait item {val id: string} class mitem(override val id: string, val name: string) extends item class ditem(override val id: string, override val name: string, val name2: string) extends mitem(valid, name, name2) object itemwrites { implicit val mitemwrites = new writes[mitem] { def writes(ditem: mitem) = json.obj( "id" -> mitem.id, "name" -> mitem.name ) } implicit val ditemwrites = new writes[ditem] { def writes(ditem: ditem) = json.obj( "id" -> ditem.id, "name" -> ditem.name, "name2" -> ditem.name2 ) } }
//response.scala
package model import itemwrites.mitemwrites import itemwrites.ditemwrites trait response { val title : string, val items : seq[item], } case class mresponse(title: string, items: seq[mitem]) extends response case class dresponse(title: string, items: seq[ditem]) extends response object responsewrites { implicit val mresponsewrite = new writes[mresponse] { def writes(mresponse: mresponse) = json.obj( "title" -> mresponse.title, "items" -> mresponse.items ) } implicit val dresponsewrite = new writes[dresponse] { def writes(dresponse: dresponse) = json.obj( "title" -> dresponse.title, "items" -> dresponse.items // **compile time error** ) } }
i compile time error on line dresponse.items.
> [error] note: implicit value dtctopicpageresponsewrite not > applicable here because comes after application point , > lacks explicit result type > [error] "items" -> dresponse.items
seems happening ditem inherits form mitem , compile getting confused between subclass , super class. how around this.
i able code compiling in scala 2.11, play 2.5.x explicitly stating types of writes
you've declared in itemwrites
- namely:
object itemwrites { implicit val mitemwrites:writes[mitem] = new writes[mitem] { def writes(mitem: mitem) = json.obj( "id" -> mitem.id, "name" -> mitem.name ) } implicit val ditemwrites:writes[ditem] = new writes[ditem] { def writes(ditem: ditem) = json.obj( "id" -> ditem.id, "name" -> ditem.name, "name2" -> ditem.name2 ) } }
once did that, scala able find out implicit right , away went.
Comments
Post a Comment