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

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -