2

Scala 反射指南中写了以下内容:

与 Manifest 一样,实际上可以请求编译器生成一个 TypeTag。这是通过简单地指定 TypeTag[T] 类型的隐式证据参数来完成的。如果编译器在隐式搜索过程中找不到匹配的隐式值,它会自动生成一个 TypeTag[T]。

这个StackOverflow 答案很好地解释了“隐含证据”的概念。但是,我仍然不完全清楚编译器将生成TypeTag[T] 意味着什么。

  • 这是否意味着这是“隐含证据”搜索的特例?即当编译器进行隐式搜索时,类 TypeTag[T] 以特殊方式处理?我试图在 Scala 反射 API 中查找隐式参数值,但没有找到提供 TypeTag[T] 的任何参数值,因此我假设 TypeTag[T] 隐式参数来自编译器内部(如文档所述)。所以类名 TypeTag[T] 被硬编码到编译器的源代码中。这个假设正确吗?

  • 隐含值的自动生成是否记录在某处?换句话说,是否有一个文档列出了所有自动生成的隐含证据?我在Scala 语言规范(2.9 版)中没有找到 TypeTag[T] 。与 TypeTag[T] 最接近的概念是 Manifest,它是自动生成的隐式参数。Manifests 是 Scala 2.9 中唯一自动生成的隐式值参数吗?

4

1 回答 1

2

是的,TypeTags 和 WeakTypeTags 被隐式搜索特别对待。现在隐式宏确实有效,我们计划删除这个硬代码,但这仍有待实现。

到目前为止,除了源代码之外,还没有关于自动生成隐式值的文档,它表示当前只生成类型标签和清单:https ://github.com/scala/scala/blob/38ee986bcad30a8835e8f197112afb5cce2b76c5/src/compiler/scala/工具/nsc/typechecker/Implicits.scala#L1288

于 2014-02-17T11:05:30.303 回答