Scala:在父方法中维护子类?

Won*_*nay 2 functional-programming scala return-current-type

当你有父母时:

abstract class Parent {
   def something(arg: ???): Parent = ???
}
Run Code Online (Sandbox Code Playgroud)

class Child extends Parent {}
Run Code Online (Sandbox Code Playgroud)

我想

val updatedChild = new Child().something(...)
Run Code Online (Sandbox Code Playgroud)

updatedChild是类型Child而不是类型Parent,这可能吗?

Dim*_*ima 5

一种方法是对父对象进行参数化:

 abstract class Parent[T <: Parent[T]] {
    def something(arg: Foo): T
 }

 class Child(val foo: String) extends Parent[Child] {
    def something(arg: String) = return new Child(arg)
 }
Run Code Online (Sandbox Code Playgroud)

有时,您也可以使用this.type

class Parent {
  def something(arg: Foo): this.type = this
}
class Child {
   override def something(arg: Foo) = this
}
Run Code Online (Sandbox Code Playgroud)

但是后一种方法仅在您想要返回的所有内容是this(this.type不是Parentor Child,而是只有一个实例的特定类型 - this)时才有效。