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

时间:2019-07-03 17:45:42

标签: scala syntax self-type

在Scala(2.12.8)自类型之间

trait T {
   this: Any =>
}

还有这个

trait T {
   this: Any
}

语义上有什么区别?

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

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

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

1 个答案:

答案 0 :(得分:5)

关键字this是类型T的表达式。 TAny的子类型,因为所有内容都是Any的子类型。因此,您可以explicitly ascribe type Any到表达式this。在初始化器中包含表达式是有效的,因此可以在this: Any的主体中编写表达式T

您也可能写过

trait T { 42: Int }

trait T { ((((this: T): T): T): T): Any }

在两种情况下,42this只是具有显式类型归属的表达式,它们根本不执行任何操作。它们不是声明,与自我类型无关。