在以下代码片段(使用 scala 2.10.3)中, TestClass1 未编译并出现错误“value toInt is not a member of 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
}
通过提供 toInt 函数的 AugmentString() 进行的 StringOps 隐式转换不适用于 TestClass1 但可以很好地应用于 TestClass2 。有人能告诉我为什么会这样,以及如何将 测试 保持为 val 而不是 def?
最佳答案
我认为,当需要推断返回类型时,这是隐式定义的限制。您与定义递归方法的情况有些相似。也就是说,“开放”隐式定义在其主体中触发了隐式查找,这在理论上可以是递归的。 (至少这是我对这个限制的解释)。
您可以注释类型:
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
}
关于scala - 在隐式 val 函数体中未应用到 StringOps 的隐式转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19359726/