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)
如何已在methodWithSideEffect中IntContainer返回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)