为什么显式调用Scala方法可以隐式解决?
为什么这个代码无法编译,但是当我取消注释指定的行时,会成功编译? (我每晚使用
Scala 2.8).似乎明确地调用string2Wrapper允许从该点隐式使用它.
class A { import Implicits.string2Wrapper def foo() { //string2Wrapper("A") ==> "B" // <-- uncomment } def bar() { "A" ==> "B" "B" ==> "C" "C" ==> "D" } object Implicits { implicit def string2Wrapper(s: String) = new Wrapper(s) class Wrapper(s: String) { def ==>(s2: String) {} } } } 编辑:感谢至今的答案,其中包括指向Martin Odersky的评论的指针,
我仍然有兴趣找出1)“循环参考错误”的危险是什么?和2)为什么显式调用有任何区别? 解决方法
明确归因于string2Wrapper的返回类型修复了问题.
class A { import Implicits._ def bar() { "A" ==> "B" "B" ==> "C" "C" ==> "D" } object Implicits { implicit def string2Wrapper(s: String): Wrapper = new Wrapper(s) class Wrapper(s: String) { def ==>(s2: String) {} } } } 在酒吧之前定义Implicits也起作用: class A { object Implicits { implicit def string2Wrapper(s: String) = new Wrapper(s) class Wrapper(s: String) { def ==>(s2: String) {} } } import Implicits._ def bar() { "A" ==> "B" "B" ==> "C" "C" ==> "D" } } 如果您需要依赖于当前范围内定义的隐式转换,请确保注释其返回类型.相当确定这已经在邮件列表中出现,可能是预期的行为而不是错误.但我现在找不到它.我猜,foo中的显式调用触发了返回类型bar的类型推断,然后在输入bar的内容时有效. UPDATE
隐式方法的主体可以调用需要隐式转换的方法.如果这两个都有推断的返回类型,那么你就是一个僵局.这在您的示例中不适用,但编译器不会尝试检测到此问题.
显式调用早期触发隐式方法的返回类型的类型推断.这是Implicits.isValid中的逻辑 sym.isInitialized || sym.sourceFile == null || (sym.sourceFile ne context.unit.source.file) || hasExplicitResultType(sym) || comesBefore(sym,context.owner) 更新2 这个最近的bug看起来是相关的:https://lampsvn.epfl.ch/trac/scala/ticket/3373 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |