关于Scala隐式转换的问题非歧义规则
-
09-10-2019 - |
题
任何人都可以用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
选择。
更新: :删除了有缺陷的例子。
始终对无参数的方法进行评估。
不隶属于 StackOverflow