在返回实际类型的协变特征中“返回此”

时间:2014-03-09 21:36:56

标签: scala covariance self-type

之前可能会问过,但我有这个问题:

trait Container[+A] {
  def a: A

  def methodWithSideEffect() = {
    // perform some side effecting work
    this
  }
}

class IntContainer(val a: Int) extends Container[Int]

如何让methodWithSideEffect中的IntContainer返回IntContainer而不是Container[Int]?我还希望不在Container特征中添加任何参数,至少从API用户的角度来看。请注意,我确实使用隐式:

进行了解决方法
implicit class MyContainer[A <: Container[_]](c: A) {
  def methodWithSideEffect(): A = {
    // perform work
    c
  }
}

但是,我确信有一些方法可以更优雅地做到这一点。

1 个答案:

答案 0 :(得分:12)

您可以使用自我类型执行此操作:

trait Container[+A] { self =>
  def a: A

  def methodWithSideEffect(): self.type = {
    // perform some side effecting work
    this
  }
}

class IntContainer(val a: Int) extends Container[Int]

...

val x: IntContainer = new IntContainer(42).methodWithSideEffect()

或仅使用this.type

trait Container[+A] {
  def a: A

  def methodWithSideEffect(): this.type = {
    // perform some side effecting work
    this
  }
}

class IntContainer(val a: Int) extends Container[Int]