Почему T является проекцией типа this.type в расширенном обозначении типа C .this.type # T - PullRequest
3 голосов
/ 02 августа 2020

Обозначение типов SLS 3.2.5 обозначает

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 Ответ

5 голосов
/ 02 августа 2020

В спецификации Scala первичной концепцией является проекция типа, а не тип, зависящий от пути.

А типы, зависящие от пути, определены в терминах проекций типов (и одиночных типов).

Например, для val c: C тип c.T по определению равен c.type#T.

И c.x имеет тип c.T aka c.type#T.

Внутренний признак C такой тип (когда экземпляр c не зафиксирован) может обозначаться как T aka this.T aka this.type#T aka C.this.T aka C.this.type#T.

...