自类型`this:T =>`和`this:T`有什么区别?

Lou*_*bel 1 syntax scala self-type

在Scala(2.12.8)之间进行自我类型

trait T {
   this: Any =>
}
Run Code Online (Sandbox Code Playgroud)

和这个

trait T {
   this: Any
}
Run Code Online (Sandbox Code Playgroud)

语义上有什么区别?

换句话说,this: Any(在第二段中)的目的是什么?

我希望编译器大吼大叫,我this在编译第二个代码片段时不应该声明,但是我得到了这个警告:

Warning:(2, 9) a pure expression does nothing in statement position
multiline expressions may require enclosing parentheses
    this: Any
Run Code Online (Sandbox Code Playgroud)

And*_*kin 5

关键字this是type的表达式TT是的子类型Any,因为一切都是的子类型Any。因此,您可以将类型明确地归因 Any于表达式this。它是有效的在初始化表达式,所以你可以写表达this: Any中的身体T

您可能还写了

trait T { 42: Int }
Run Code Online (Sandbox Code Playgroud)

要么

trait T { ((((this: T): T): T): T): Any }
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,42并且this仅仅是具有显式类型归属的表达式,它们什么都不做。它们不是声明,与自我类型无关。