在以下代码片段(使用 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/

10-13 04:32