Eine implizit Frage an Scala-Neulinge scheint zu sein: Wo sucht der Compiler nach Implikaten? Ich spreche von implizit, weil die Frage anscheinend nie vollständig gestellt wird, als ob es keine Worte dafür gäbe :-) Zum Beispiel, wo werden die Werte für integral
von unten kommen?
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
Eine weitere Frage, die sich denjenigen stellt, die sich entschließen, die Antwort auf die erste Frage zu lernen, ist, wie der Compiler in bestimmten Situationen, in denen er offensichtlich nicht eindeutig ist (die aber trotzdem kompiliert werden), entscheidet, welche implizite Sprache er verwendet.
Zum Beispiel, scala.Predef
definiert zwei Konvertierungen von String
: eine bis WrappedString
und eine weitere an StringOps
. Beide Klassen teilen sich jedoch eine Menge Methoden, warum beschwert sich Scala also nicht über die Mehrdeutigkeit, wenn man z.B. map
?
Note : Diese Frage wurde inspiriert durch diese andere Frage in der Hoffnung, das Problem auf eine allgemeinere Weise zu formulieren. Das Beispiel wurde von dort kopiert, weil es in der Antwort erwähnt wird.