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

标签 scala reflection implicit scala-2.10 scala-compiler

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/

相关文章:

java - 获取 ArrayList 类的对象类型

perl - 为什么 "import"子程序在 Perl 中没有大写

scala - 为什么在没有子类型证据的情况下,这个多函数案例的隐式推导会失败?

scala - 缺少 Cats Functor[Future] 实例

Scala groupBy + mapValues + 映射回初始格式。有没有更好的办法

Scala:覆盖 toString 以便在字符串周围打印引号

scala - 尽管优先考虑了隐式,为什么我会收到 "ambiguous implicits"错误?

scala - LiftWeb Loc.Template 参数

java - 类的实例是不可变的吗?

java - 用反射覆盖最终静态字段是否有限制?