在以下代码段中(使用scala 2.10.3) TestClass1 无法编译时出现错误“ value toInt不是String ”的成员但是 TestClass2 编译好:
trait TestTrait {
implicit def test: (String => Int)
}
object TestClass1 extends TestTrait {
implicit val test = (value: String) => value.toInt
}
object TestClass2 extends TestTrait {
implicit def test = (value: String) => value.toInt
}
StringOps 隐式转换通过 augmentString()提供 toInt 函数,不会在 TestClass1 但在 TestClass2 中应用得很好。有人可以告诉我为什么会这样,以及如何保持测试 val 而不是 def ?
答案 0 :(得分:2)
我认为,当需要推断返回类型时,这是隐式定义的限制。您处于与定义递归方法类似的情况。也就是说,“开放”隐式定义会在其主体中触发隐式查找,理论上它可以是递归的。 (至少这是我对这个限制的解释)。
您可以注释类型:
object TestClass1 extends TestTrait {
implicit val test: String => Int = value => value.toInt // or _.toInt
}
或删除implicit
关键字 - 因为它正在实施TestTrait
中的隐式方法,您无需重新声明implicit
关键字:
object TestClass1 extends TestTrait {
val test = (value: String) => value.toInt
}