Un implicite question pour les nouveaux arrivants à la Scala semble être: d'où vient le compilateur recherchez implicites? Je veux dire implicite parce que la question ne semble jamais être pleinement formé, comme si il n'y avait pas de mots pour cela. :-) Par exemple, où les valeurs de integral
ci-dessous proviennent de?
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
Une autre question qui n'a suivre pour ceux qui décident d'apprendre la réponse à la première question est de savoir comment le compilateur de choisir l'implicite à l'utilisation, dans certaines situations d'ambiguïté apparente (mais que la compilation de toute façon)?
Par exemple, scala.Predef
définit deux conversions à partir de la String
: l'un à l' WrappedString
et un autre pour StringOps
. Les deux classes, cependant, de partager un grand nombre de méthodes, alors pourquoi ne pas Scala se plaindre d'ambiguïté quand, par exemple, en appelant map
?
Remarque: cette question a été inspiré par cette autre question, dans l'espoir de poser le problème d'une manière plus générale. L'exemple a été copié à partir de là, parce qu'il est mentionné dans la réponse.