Ho due classi PixelObject
, ImageRefObject
e altre ancora, ma qui ci sono solo queste due classi per semplificare le cose. Sono tutte sottoclassi di un trait Object
che contiene un UID. Ho bisogno di un metodo universale che copierà un'istanza della classe case con un nuovo dato uid
. Il motivo per cui ne ho bisogno perché il mio compito è quello di creare un ObjectRepository di classe che salverà l'istanza di qualsiasi sottoclasse di Object
e restituirà il nuovo uid
. Il mio tentativo:Scala case class copia con tipo generico
trait Object {
val uid: Option[String]
}
trait UidBuilder[A <: Object] {
def withUid(uid: String): A = {
this match {
case x: PixelObject => x.copy(uid = Some(uid))
case x: ImageRefObject => x.copy(uid = Some(uid))
}
}
}
case class PixelObject(uid: Option[String], targetUrl: String) extends Object with UidBuilder[PixelObject]
case class ImageRefObject(uid: Option[String], targetUrl: String, imageUrl: String) extends Object with UidBuilder[ImageRefObject]
val pix = PixelObject(Some("oldUid"), "http://example.com")
val newPix = pix.withUid("newUid")
println(newPix.toString)
ma sto ottenendo il seguente errore:
➜ ~ scala /tmp/1.scala
/tmp/1.scala:9: error: type mismatch;
found : this.PixelObject
required: A
case x: PixelObject => x.copy(uid = Some(uid))
^
/tmp/1.scala:10: error: type mismatch;
found : this.ImageRefObject
required: A
case x: ImageRefObject => x.copy(uid = Some(uid))
^
two errors found