关于Scala隐式转换的问题非歧义规则

时间:2010-10-18 19:30:01

标签: scala implicit-conversion

任何人都可以通过Scala隐式转换机制向我解释以下情况。有一个代码:

object Main {
  implicit val x:Int => String = v => "val"
  implicit def y(v:Int) = "def"

  def p(s:String) = print(s)

  def main(args: Array[String]): Unit = {
      p(1)
  }
}

此代码打印“val”。但是当我评论第二行时:

//implicit val x:Int => String = v => "val"

代码打印“def”。

因此,在这种情况下,隐式转换(x和y)都是可能的。存在非歧义规则 - 只有在没有其他可能的插入转换时才会插入隐式转换。根据这条规则,这段代码根本不应该编译。但代码已成功编译和执行。我不明白的是什么?

感谢。

1 个答案:

答案 0 :(得分:9)

原因在Scala语言规范第6.26.2节中说明。

在将方法视为函数之前,需要通过执行eta-expansion将其转换为1。因此,必须再应用一次隐式转换,因此选择val

更新:删除了有缺陷的示例。

始终隐式执行无参数的方法评估。