【发布时间】:2012-03-07 17:47:30
【问题描述】:
我昨天遇到了一个奇怪的错误,最终我将其简化为以下代码:
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class X extends Function[String, Int] { def apply(x: String) = Integer.parseInt(x) }
defined class X
scala> implicit val x = new X
x: X = <function1>
scala> "56" / 2
res2: Int = 28
我希望这会引发异常,因为 String 没有 / 方法。相反,Scala 将隐式变量视为隐式方法(因为它实现了Function[String,Int])并将字符串“56”转换为整数 56。
这是如何工作的?根据隐式搜索的规则,我认为不会考虑充当函数的隐式变量。
【问题讨论】:
-
实际上,
implicit def转换是有效的,因为它会自动转换为函数值(即 eta 扩展)。