最佳答案
对于Scala新手来说,一个隐式的问题似乎是:编译器在哪里寻找隐式函数?我指的是含蓄,因为这个问题似乎从来没有完全形成过,好像没有词来形容它。:-)例如,下面的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.Predef
定义了两个从String
的转换:一个到WrappedString
,另一个到StringOps
。然而,这两个类共享许多方法,那么为什么Scala在调用map
时不抱怨歧义呢?
注意:这个问题是受到另一个问题的启发,希望以更一般的方式说明问题。示例是从那里复制的,因为答案中引用了它。