定义scala trait def,返回具体的子类型实例

时间:2016-11-29 04:20:17

标签: scala

我正在尝试定义用于简单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]

1 个答案:

答案 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)
}