Art*_*amp 11 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)
}
}
Run Code Online (Sandbox Code Playgroud)
此代码打印"val".但是当我评论第二行时:
//implicit val x:Int => String = v => "val"
Run Code Online (Sandbox Code Playgroud)
代码打印"def".
因此,在这种情况下,隐式转换(x和y)都是可能的.存在非歧义规则 - 只有在没有其他可能的插入转换时才会插入隐式转换.根据这条规则,这段代码根本不应该编译.但代码已成功编译和执行.我不明白的是什么?
谢谢.
Mor*_*itz 10
其原因在Scala语言规范第6.26.2节中说明.
在将方法视为函数之前,需要通过执行eta-expansion将其转换为1.因此,必须再应用一次隐式转换,因此val选择了它.
更新:删除了有缺陷的例子.
总是无意地执行对没有参数的方法的评估.
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |