隐式转换为未在隐式val函数体中应用的StringOps

时间:2013-10-14 11:57:21

标签: scala implicit-conversion

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

1 个答案:

答案 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
}