之前可能会问过,但我有这个问题:
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
}
}
但是,我确信有一些方法可以更优雅地做到这一点。
答案 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]