11

任何人都可以用 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)都是可能的。有一个非歧义规则- 只有在没有其他可能的转换插入时才插入隐式转换。根据这条规则,这段代码根本不应该被编译。但是代码已成功编译并执行。我不明白什么?

谢谢。

4

1 回答 1

10

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

在将方法视为函数之前,需要通过执行 eta 扩展将其转换为函数。因此,必须应用另外一种隐式转换,因此val选择了。

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

对没有参数的方法的评估总是隐式执行的。

于 2010-10-18T20:24:07.180 回答