8

我现在正在深入阅读 Scala。这是本书的摘录:

所有依赖于路径的类型都是类型投影。路径相关类型被编译器foo.Bar重写为...foo.type#Bar

在 Scala 中,所有类型引用都可以编写为针对命名实体的项目。scala.String 类型是scala.type#String名称scala引用包scala的简写,类型由scala 包上String的类定义。String

显然,没有scala.String课程,但我未能用Null.

scala> type N = scala.type#Null
<console>:7: error: type mismatch;
 found   : type
 required: AnyRef
       type N = scala.type#Null

所以,我的问题如下。路径相关类型是类型投影吗?它只是内部编译器表示还是可以用scala代码表示?

4

1 回答 1

10

这是一个快速的 REPL 会话,它确认了 Josh 所写的内容,

scala> class Foo { type T = String }
defined class Foo

scala> val foo = new Foo
foo: Foo = Foo@10babe8

scala> implicitly[foo.type#T =:= foo.T]
res0: =:=[foo.T,foo.T] = <function1>

您的scala.type#Null示例的问题在于前缀scala是包前缀,而不是值的稳定标识符。可以说它应该是后者,但不幸的是它不是……这是 Scala 包的语义和 Scala 对象(在模块的意义上)之间挥之不去的不匹配。

于 2012-05-11T18:22:27.597 回答