相关疑难解决方法(0)

如何使用Scala的这种打字,抽象类型等来实现Self类型?

在任何其他问题中我都找不到答案.假设我有一个抽象的超类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.

这个问题有什么解决方案?

scala self-type abstract-type

44
推荐指数
2
解决办法
2万
查看次数

标签 统计

abstract-type ×1

scala ×1

self-type ×1