我正在尝试定义用于简单CRUD系统的基本特征。但是,我需要基本特征来支持" copyWithId" def(因为Scala案例类魔法副本不可用)。我到目前为止找到的最佳方法是:
trait Identifiable[ID, T] {
def id: Option[ID]
def copyWithId(id: Option[ID]): T
}
case class TestNamedIdentity(id: Option[Int], name: String)
extends Identifiable[Int, TestNamedIdentity] {
def copyWithId(id: Option[Int]): TestNamedIdentity = {
copy(id = id)
}
}
这有效,但看起来有点笨重,因为它需要所有具体实例扩展ID和Self。我想写下面的内容:
trait Identifiable[ID] {
this:X =>
def copyWithId(id: Option[ID]): X
def id: Option[ID]
}
使用某种形式的自我引用具体类。有什么方法可以做到这一点吗?
更新:使用下面的用例
这个想法是在像
这样的代码中使用它abstract class SomeClass[A <: IdentifiableEntity[ID], ID] {
def someFunc2: Option[ID]
def someFunc(item: A): A = {
item.copyWithId(someFunc2)
}
}
使用@jwvh中的解决方案需要&#34; asInstanceOf&#34;通话结束后。哪个用于我的用例,但希望有一个更优雅的解决方案。
item.copyWithId(someFunc2).asInstanceOf[A]
答案 0 :(得分:1)
这似乎有效。
trait Identifiable[ID] {
def id: Option[ID]
def copyWithId(id: Option[ID]): Identifiable[ID]
}
然后简化了案例类。
case class TestNamedIdentity(id: Option[Int], name: String
) extends Identifiable[Int] {
def copyWithId(id: Option[Int]): TestNamedIdentity = copy(id = id)
}