gpt4 book ai didi

scala - "return this"在返回实际类型的协变特征中

转载 作者:行者123 更新时间:2023-12-04 10:25:15 25 4
gpt4 key购买 nike

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

trait Container[+A] {
def a: A

def methodWithSideEffect() = {
// perform some side effecting work
this
}
}

class IntContainer(val a: Int) extends Container[Int]

我如何拥有 methodWithSideEffectIntContainer返回 IntContainer而不是 Container[Int] ?我也不想向 Container 添加任何参数trait,至少从 API 用户的角度来看是这样。请注意,我确实做了一个隐式的解决方法:
implicit class MyContainer[A <: Container[_]](c: A) {
def methodWithSideEffect(): A = {
// perform work
c
}
}

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

最佳答案

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

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]

关于scala - "return this"在返回实际类型的协变特征中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com