在 Scala reflection guide写成如下:
As with Manifests, one can in effect request that the compiler generate a TypeTag. This is done by simply specifying an implicit evidence parameter of type TypeTag[T]. If the compiler fails to find a matching implicit value during implicit search, it will automatically generate a TypeTag[T].
This StackOverflow 的答案完美地解释了“隐性证据”的概念。然而,我仍然不完全清楚编译器将意味着什么 生成一个 TypeTag[T]。
这是否意味着这是“隐性证据”搜索的特例? IE。当编译器进行隐式搜索时,类 TypeTag[T] 会以特殊方式处理?我尝试在 Scala 反射 API 中查找隐式参数值,但没有找到任何提供 TypeTag[T] 的值,因此我假设 TypeTag[T] 隐式参数来自编译器内部(如文档所述)。因此类名 TypeTag[T] 被硬编码到编译器的源代码中。这个假设正确吗?
自动生成隐式值是否记录在某处?换句话说,是否有一个文档列出了所有自动生成的隐式证据?我在 Scala language specification 中没有找到 TypeTag[T] (2.9 版)。与 TypeTag[T] 最接近的概念是 Manifest,它是自动生成的隐式参数。 list 是 Scala 2.9 中唯一自动生成的隐式值参数吗?
最佳答案
是的,TypeTags 和 WeakTypeTags 通过隐式搜索进行特殊处理。现在implicit macros事实上,我们计划删除这个硬代码,但这仍有待实现。
到目前为止,除了源代码之外,还没有自动生成隐式值的文档,其中表示当前仅生成类型标签和 list :https://github.com/scala/scala/blob/38ee986bcad30a8835e8f197112afb5cce2b76c5/src/compiler/scala/tools/nsc/typechecker/Implicits.scala#L1288
关于scala - Scala 2.10 中编译器生成的隐式值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21825631/