在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中显示了唯一自动生成的隐式值参数?
答案 0 :(得分:2)
是的,TypeTags和WeakTypeTags由隐式搜索专门处理。现在implicit macros实际上有效,我们计划删除此硬编码,但仍有待实施。
到目前为止,除了源代码之外,没有自动生成隐式值的文档,其中表示当前只生成类型标记和清单:https://github.com/scala/scala/blob/38ee986bcad30a8835e8f197112afb5cce2b76c5/src/compiler/scala/tools/nsc/typechecker/Implicits.scala#L1288