任何人都可以用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)都是可能的。有一个 非混合规则 - 仅当没有其他可能的转换即可插入时,才会插入隐式转换。根据此规则,该代码根本不应编译。但是该代码已成功编译和执行。我不明白吗?

谢谢。

有帮助吗?

解决方案

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

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

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

始终对无参数的方法进行评估。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top