Wie verursacht dieses implizite val einen StackOverFlowError?skalare implizite Ursachen StackOverflowError
(verglichen meinen ursprünglichen Code unten, um noch den Fehler zu verursachen)
object Complicit {
// a class with name, default, and conversion function as implicit val
case class CC[A](name: String, defaultValue: A)(implicit val convert: String => A) {
def getFrom(s: String): A= try {
convert(s)
} catch {
case t: Throwable =>
println("ERROR: %s".format(t)) // just to see the StackOverflowException
defaultValue
}
}
// this works fine
object Works {
val cc1= CC("first", 0.1)(_.toDouble)
}
// this causes java.lang.StackOverflowError due to the implicit
object Fails {
// !!! StackOverFlowError here
implicit val stringToDouble: String => Double= { _.toDouble }
val cc2= CC("second", 0.2)
}
def main(args: Array[String]) {
// this works
println("%s %f".format(Works.cc1.name, Works.cc1.getFrom("2.3")))
// this fails
println("%s %f".format(Fails.cc2.name, Fails.cc2.getFrom("4.5")))
}
}
Bin ich etwas Illegales mit implicits tun?
Weiß jemand, ob dies ein Fehler ist, der sich zu übermitteln lohnt? Es scheint mir der Umfang einer impliziten Konvertierung, sollte nicht innerhalb der definierenden Code dieser Konvertierung gültig sein. (also immer ausgeschlossen). Das einzige Ergebnis, das jemals daraus hervorgehen könnte, wäre immer eine Endlosschleife. – LaloInDublin
Ich nahm eine Chance wahr, dass es sich lohnen könnte, das Problem anzugehen und einzureichen. Scala Programmiersprache/SI-7693 – LaloInDublin
Ich denke, es ist fairer, Scala zu sagen tat genau das, wozu man es gebeten hatte (also kein Bug). Es ist gut, das Problem einzureichen und zu sehen, was passiert. Vielleicht gibt es eine clevere Möglichkeit, den Benutzer zu erkennen und zu warnen. Aber das Problem ist, dass es vor der Rekursion eine Menge und Komplexität des Codes geben könnte. Vielleicht wollte jemand diese Rekursion und hat eine Ausgangsbedingung codiert. – Core