这可能是以前问过的,但是我有这个问题:

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]?我也不想至少从API用户的角度向Container特征添加任何参数。请注意,我确实采用了隐式的解决方法:

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


但是,我很确定有某种方法可以更优雅地做到这一点。

最佳答案

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

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]

08-24 12:49