Tôi có hai lớp PixelObject
, ImageRefObject
và một số chi tiết khác, nhưng đây chỉ là hai lớp này để đơn giản hóa mọi thứ. Tất cả đều là các lớp con của trait Object
có chứa một uid. Tôi cần phương pháp phổ quát sẽ sao chép một cá thể lớp vỏ với một số mới uid
. Lý do tôi cần nó bởi vì nhiệm vụ của tôi là tạo ra một lớp ObjectRepository mà sẽ tiết kiệm dụ của bất kỳ lớp con nào của Object
và trả về nó với uid
mới. nỗ lực của tôi:Trường hợp bản sao Scala với loại chung
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)
nhưng tôi nhận được lỗi sau:
➜ ~ 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