私には 2 つのクラスがありPixelObject
、ImageRefObject
さらにいくつかのクラスがありますが、簡単にするためにこれら 2 つのクラスだけを示します。それらはすべてtrait Object
、uid を含む a のサブクラスです。ケースクラスインスタンスを指定された new でコピーするユニバーサルメソッドが必要uid
です。Object
私のタスクは、サブクラスのインスタンスを保存し、それを new で返すクラス ObjectRepository を作成することであるため、必要な理由ですuid
。私の試み:
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)
しかし、私は次のエラーが発生しています:
➜ ~ 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