加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么显式调用Scala方法可以隐式解决?

发布时间:2020-12-16 09:18:42 所属栏目:安全 来源:网络整理
导读:为什么这个代码无法编译,但是当我取消注释指定的行时,会成功编译? (我每晚使用 Scala 2.8).似乎明确地调用string2Wrapper允许从该点隐式使用它. class A { import Implicits.string2Wrapper def foo() { //string2Wrapper("A") == "B" // -- uncomment } de
为什么这个代码无法编译,但是当我取消注释指定的行时,会成功编译? (我每晚使用 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的评论的指针,

“An implicit conversion without explicit result type is visible only in the text
following its own definition. That way,we avoid the cyclic reference errors.”

我仍然有兴趣找出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

What is the danger of the cyclic reference error?

隐式方法的主体可以调用需要隐式转换的方法.如果这两个都有推断的返回类型,那么你就是一个僵局.这在您的示例中不适用,但编译器不会尝试检测到此问题.

Why does an explicit call make a difference?

显式调用早期触发隐式方法的返回类型的类型推断.这是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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读