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

Posted

技术标签:

【中文标题】为啥 T 是扩展类型指示符 C.this.type#T 中 this.type 的类型投影【英文标题】:Why is T a type projection of this.type in expanded type designator C.this.type#T为什么 T 是扩展类型指示符 C.this.type#T 中 this.type 的类型投影 【发布时间】:2020-11-22 16:37:45 【问题描述】:

SLS 3.2.5 Type Designators表示

trait C 
  type T
  val x: T

扩展到

trait C 
  type T
  val x: C.this.type#T

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

【问题讨论】:

【参考方案1】:

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

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

例如对于val c: C,类型c.T 定义为c.type#T

c.x 的类型为c.T 又名c.type#T

内部特征C 这种类型(当实例c 不固定时)可以称为T aka this.T aka this.type#T aka C.this.T aka C.this.type#T

【讨论】:

以上是关于为啥 T 是扩展类型指示符 C.this.type#T 中 this.type 的类型投影的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言ARM扩展资料数据表示

警告:解析问题:使用GNU老式字段指示符扩展名

decltype类型指示符

django:使用没有 unicode 'u' 类型指示符的安全过滤器渲染变量

为啥打字稿抱怨对象必须是扩展类型中的对象

aop中Pointcut切入点指示符