scala隐式导致StackOverflowerr错误

scala隐式导致StackOverflowerr错误,scala,stack-overflow,implicits,Scala,Stack Overflow,Implicits,此隐式val如何导致StackOverflower错误 (删减了我的原始代码,仍然导致错误) 我是不是在用暗示做违法的事?我相信我能回答这里发生的事情。。它与其他隐式转换以及您刚刚创建的转换相关。如果添加此跟踪,您可以确认堆栈溢出通常与什么有关-一个函数反复调用自身,直到java的堆栈空间崩溃: implicit val stringsToDouble: String => Double= { x=>println("called inner "+x); x.toDouble }

此隐式val如何导致StackOverflower错误

(删减了我的原始代码,仍然导致错误)


我是不是在用暗示做违法的事?

我相信我能回答这里发生的事情。。它与其他隐式转换以及您刚刚创建的转换相关。如果添加此跟踪,您可以确认堆栈溢出通常与什么有关-一个函数反复调用自身,直到java的堆栈空间崩溃:

implicit val stringsToDouble: String => Double= { x=>println("called inner "+x); x.toDouble }
。。。。 称为内部4.5 称为内部4.5 称为内部4.5 称为内部4.5 调用内部4.5错误:java.lang.StackOverflower错误

我认为现在发生的事情是这样的——toDouble不是java字符串的自然函数,而是使用StringOps中的隐式转换(或者StringLike,我不太确定,但这是同一个问题)

因此,当调用toDouble时,编译器开始寻找可能包含函数“toDouble”的隐式转换。理论上,它可以是任何结果类

但是-如果几个隐式转换可以实现这一点,会发生什么?不幸的是,“Double”还包含了Double函数,如下所示:

val x = 44.4
x.toDouble
你猜怎么着?这意味着您的新隐式函数(现在范围最接近)赢得了竞赛,并在一个圆圈中被调用以完成“toDouble”——有效地尝试将字符串转换为double,以便反复调用toDouble(在类double上)。。我承认这相当令人困惑,但证据是正确的

这是解决办法。。它符合解释并防止递归调用

 implicit val stringsToDouble: String => Double= { java.lang.Double.parseDouble(_)  }

有人知道这是否是一个值得提交的bug吗?在我看来,隐式转换的范围在该转换的定义代码中是无效的。(因此,始终排除在外)。允许这样做的唯一结果永远是一个无限的循环。我冒了一个可能值得解决的机会,提交了这个问题。。Scala编程语言/SI-7693我认为更公平的说法是Scala做了它被要求做的事情(即不是一个bug)。很高兴提交问题,看看会发生什么。也许有一种聪明的方法可以检测并警告用户。但是,问题是在递归之前,可能存在任意数量和复杂性的代码。另外,可能有人想要这个递归,并编写了一个退出条件。
 implicit val stringsToDouble: String => Double= { java.lang.Double.parseDouble(_)  }