这可能是以前问过的,但是我有这个问题:
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]