在Scala中,反射指南如下所示:
与Manifests一样,实际上可以请求编译器生成TypeTag。这是通过简单地指定一个隐式TypeTag[T]类型的证据参数。如果编译器找不到在隐式搜索过程中匹配隐式值,它将自动生成一个TypeTag[T]。
这个StackOverflow答案完美地解释了"隐含证据"的概念。然而,我仍然不完全清楚编译器将生成一个TypeTag[T]。
-
这是否意味着这是"隐性证据"搜索的特殊情况?例如,当编译器进行隐式搜索时,类TypeTag[T]是以一种特殊的方式处理的?我试图在Scala反射API中寻找隐式参数值,但没有找到任何提供TypeTag[T]的值,所以我假设TypeTag[T]implict参数来自编译器内部(正如文档所说)。因此,类名TypeTag[T]被硬编码到编译器的源代码中。这个假设正确吗?
-
隐式值的自动生成是否有文档记录?换句话说,某个地方是否有一个文档列出了所有自动生成的隐含证据?我在Scala语言规范(版本2.9)中没有找到TypeTag[T]。与TypeTag[T最接近的概念是Manifest,它是自动生成的隐式参数。Manifests是Scala2.9中唯一自动生成的隐式值参数吗?
是的,TypeTags和WeakTypeTags通过隐式搜索进行特殊处理。既然隐式宏确实有效,我们计划删除这个硬代码,但这还有待实现。
到目前为止,除了源代码之外,还没有关于自动生成隐式值的文档,源代码表示目前只生成类型标记和清单:https://github.com/scala/scala/blob/38ee986bcad30a8835e8f197112afb5cce2b76c5/src/compiler/scala/tools/nsc/typechecker/Implicits.scala#L1288