为什么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=].
以下代码可以正常工作
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.typeclass 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 ofAxis
.
方法调用链
new XAxis().text
will callappend
append has the return type
this.type
this
is an instance ofXAxis
.So
this.type
isAxis
所以无论是否将 this.type
指定为 return 类型,Scala 应该总是可以推断出真实的实例类型。
为什么当我们显式指定 return 类型时有效 this.type
?
但是当我们没有显式指定return类型时,它不起作用this.type
?
当您不指定方法的 return 类型时,编译器将对其进行推断。更具体地说,编译器将始终推断出最精确的类型,但永远不会推断出单例类型(可以通过 value.type
表示法识别)。所以在这种情况下,方法 text
将被推断为 return 类型 Axis
的东西,这是 class [=] 中 this.type
最精确的超类型12=].