scala - Scala查找隐式在哪里 ?

  显示原文与译文双语对照的内容

一个隐新人 Scala 似乎是问题: 编译器在哪里查找 implicits? 我的意思是隐式的,是因为这个问题似乎永远不会得到完全成形,好像没有话说。 integral: - ) 例如下面的的值来自哪里?


scala> import scala.math._
import scala.math._

scala> def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}
foo: [T](t: T)(implicit integral: scala.math.Integral[T])Unit

scala> foo(0)
scala.math.Numeric$IntIsIntegral$@3dbea611

scala> foo(0L)
scala.math.Numeric$LongIsIntegral$@48c610af

另一个问题,并跟进那些决定学习第一个问题的答案是编译器如何选择使用哪一个隐式的,在某些情况下明显的模糊性( 但是无论如何都是这样的)?

例如 scala.PredefString 定义了两个转换: 一个到 WrappedString,另一个指向 StringOps 。 两类,然而,分享很多方法,那么为什么不 Scala 抱怨模棱两可时,说,叫 map

注意:这个问题的灵感来源于另一问题,说明问题的希望在一个更普遍的方式。 示例是从那里复制的,因为它在答案中被引用。

时间: 原作者:

我想找到的隐式参数的优先级分辨率,不仅寻找,所以我写了一篇博客文章回顾implicits没有进口税 ( 隐式参数优先级再次在某些反馈之后) 。

下面是列表:

  • 1 ) 通过本地声明,导入,外部范围,继承,包对象对当前调用范围可见,无需前缀即可访问。
  • 2 ) 隐范围,其中包含所有的同伴对象和包对象关系一些隐式是我们搜索( 例如 类型。 类型的包对象,类型的伴侣对象,类型构造函数的类型,如果有的话,它的参数,以及它的父类型和 supertraits 。

如果在两个阶段中我们发现不止一个隐式的,静态重载规则被用来解决它。

原作者:
...