路径相关类型是类型投影吗?

2024-01-01

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

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

在 Scala 中,所有类型引用都可以编写为针对命名实体的项目。类型 scala.String 是以下形式的简写scala.type#String名字在哪里scala指的是包scala和类型String定义为Stringscala 包上的类。

显然,不存在scala.String类,但我未能重现这一点Null.

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

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


这是一个快速的 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 对象(在模块意义上)的语义之间挥之不去的不匹配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

路径相关类型是类型投影吗? 的相关文章

随机推荐