我现在正在深入阅读Scala。以下是该书的摘录:
所有与路径相关的类型都是类型投影。将重写与路径相关的类型
foo.Bar
编译为foo.type#Bar
...在Scala中,所有类型引用都可以作为针对命名实体的项目编写。 scala.String类型是
scala.type#String
的简写,其中名称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代码表示?
答案 0 :(得分:9)
这是一个快速的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对象(在模块意义上)的语义之间的不一致。