在任何其他问题中我都找不到答案.假设我有一个抽象的超类Abstract0,它有两个子类,Concrete1和Concrete1.我希望能够在Abstract0中定义类似的东西
def setOption(...): Self = {...}
Run Code Online (Sandbox Code Playgroud)
Self将成为具体的子类型.这将允许链接调用setOption,如下所示:
val obj = new Concrete1.setOption(...).setOption(...)
Run Code Online (Sandbox Code Playgroud)
并且仍然将Concrete1作为obj的推断类型.
我不想要的是定义这个:
abstract class Abstract0[T <: Abstract0[T]]
Run Code Online (Sandbox Code Playgroud)
因为它使客户更难以处理这种类型.我尝试了各种可能性,包括抽象类型:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
Run Code Online (Sandbox Code Playgroud)
但是后来不可能实现setOption,因为this在Abstract0中没有类型Self.并且使用this: Self =>也不适用于Abstract0.
这个问题有什么解决方案?