为什么 T 是扩展类型指示符 C.this.type#T 中 this.type 的类型投影

Mar*_*lic 3 types scala terminology

SLS 3.2.5 类型代号表示

trait C {
  type T
  val x: T
}
Run Code Online (Sandbox Code Playgroud)

扩展到

trait C {
  type T
  val x: C.this.type#T
}
Run Code Online (Sandbox Code Playgroud)

我熟悉.type单例类型的符号,但我不确定它如何转换为C.this.type#T. 例如。什么是this.type试图传达的部分而不只是说C#T

Dmy*_*tin 5

在 Scala 规范中,主要概念是类型投影而不是依赖于路径的类型。

依赖于路径的类型是根据类型投影(和单例类型)定义的。

例如,val c: C类型c.Tc.type#T根据定义。

c.x具有类型c.Taka c.type#T

在 trait 内部,C这种类型(当实例c不固定时)可以称为Taka this.Taka this.type#Taka C.this.Taka C.this.type#T