为什么Scala在继承class中使用chain方法时如果没有指定this.type会报错

Why Scala reports error if does not specify this.type when using chain method in inherited class

以下代码可以正常工作

abstract class Base {
  def append(value: Any): this.type = this
}

class Axis extends Base {
  def text(value: String): this.type = append(value)
}

class XAxis extends Axis {
  def position(value: Int): this.type = append(value)
}

def main(args: Array[String]): Unit = {
  new XAxis().text("hello").position(0)
}

而如果我在 Axis.text

中删除 this.type
class Axis extends Base {
  // here we don't explicitly specify return type this.type
  def text(value: String) = append(value)
}

Scala 报告

value position is not a member of Axis.

方法调用链

new XAxis().text will call append

append has the return type this.type

this is an instance of XAxis.

So this.type is Axis

所以无论是否将 this.type 指定为 return 类型,Scala 应该总是可以推断出真实的实例类型。

为什么当我们显式指定 return 类型时有效 this.type?

但是当我们没有显式指定return类型时,它不起作用this.type?

当您不指定方法的 return 类型时,编译器将对其进行推断。更具体地说,编译器将始终推断出最精确的类型,但永远不会推断出单例类型(可以通过 value.type 表示法识别)。所以在这种情况下,方法 text 将被推断为 return 类型 Axis 的东西,这是 class [=] 中 this.type 最精确的超类型12=].