Scala 2.10中编译器生成的隐式值是什么?

时间:2014-02-17 09:49:12

标签: scala reflection implicit scala-2.10 scala-compiler

Scala reflection guide中写有以下内容:

  

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

This StackOverflow回答精美地解释了"隐含证据的概念"。但是,我仍然不完全清楚编译器会是什么意思    生成一个TypeTag [T]。

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

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

1 个答案:

答案 0 :(得分:2)

是的,TypeTags和WeakTypeTags由隐式搜索专门处理。现在implicit macros实际上有效,我们计划删除此硬编码,但仍有待实施。

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