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

sca*_*1sk 7 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]
Run Code Online (Sandbox Code Playgroud)

如何已在methodWithSideEffectIntContainer返回IntContainer,而不是一个Container[Int]?我还想不要在Container特征中添加任何参数,至少从API用户的角度来看.请注意,我确实使用隐式进行了解决方法:

implicit class MyContainer[A <: Container[_]](c: A) {
  def methodWithSideEffect(): A = {
    // perform work
    c
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我确信有一些方法可以更优雅地完成这项工作.

ear*_*las 13

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

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]
Run Code Online (Sandbox Code Playgroud)

...

val x: IntContainer = new IntContainer(42).methodWithSideEffect()
Run Code Online (Sandbox Code Playgroud)

或者只是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]
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`this.type` (4认同)