Lassen Sie uns diesen Code betrachten:Warum müssen wir explizit implizite Konvertierungen mit impliziten Parametern von Begleitobjekten importieren? Seltsam.
class A
object A{
implicit def A2Int(implicit a:A)=1
implicit def A2String(a:A)="Hello"
}
object Run extends App{
implicit val a: A =new A
import A.A2Int
// without this import this code does not compile, why ?
// why is no import needed for A2String then ?
def iWantInt(implicit i:Int)=println(i)
def iWantString(implicit s:String)=println(s)
iWantInt
iWantString(a)
}
Es läuft und Drucke:
1
Hello
Nun, wenn wir die Linie
Kommentar ausimport A.A2Int
wir einen Kompilierungsfehler erhalten dann:
Mit der Zeile auskommentiert, warum kann Scala A.A2String
nicht finden, wenn es A.A2Int
finden kann?
Wie kann dieses Problem behoben werden?
Danke fürs Lesen.
Darüber hinaus wird der Compiler nicht mehr als eine implizite ausführen * Lookup * um Typen anzupassen, während Sie implizite Lookups für 'iWantInt' haben: eine implizite Lookup zu transformieren 'A' zu' Int' und eine implizite Suche, um den Parameter von 'iWantInt' zu finden. Im Fall von "iWantString" gibt es nur eine implizite Suche, die "A" in "String" umwandelt. –
Dies ist falsch. Ist Ihnen aufgefallen, dass der Code nur mit zusätzlicher Importanweisung kompiliert wird? Der Compiler führt nicht mehr als eine implizite Suche ** alleine aus, das ist richtig. Aber hier fragt die erste Konvertierung nach einem impliziten Wert vom Typ 'A', der die zweite implizite Suche startet. –
Sie haben Recht damit, was ich meinte ist, dass der Compiler zuerst eine implizite Umwandlung von "A" zu "Int" finden müsste, um einen impliziten Int-Parameter zu finden (ohne den Import). Dies ist eine Abhängigkeit zwischen diesen beiden impliziten Suchvorgängen, da Sie die erste nicht auflösen können, ohne die zweite zu lösen. Die beiden impliziten Lookups, die Sie beschreiben, sind nicht voneinander abhängig.Zuerst löst es den impliziten Parameter 'Int' auf (weil 'A.A2Int' importiert wurde) und löst dann die zweite implizite Suche auf, dh den impliziten Parameter von 'A.A2Int', der aufgelöst wird, weil 'val a' implizit ist . –