3

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

4

1 回答 1

2

我认为,当需要推断返回类型时,这是隐式定义的限制。您与定义递归方法的情况有些相似。也就是说,“开放”的隐式定义在其主体中触发隐式查找,理论上可以是递归的。(至少这是我对这个限制的解释)。

您可以注释类型:

object TestClass1 extends TestTrait {
  implicit val test: String => Int = value => value.toInt  // or _.toInt
}

或删除implicit关键字——因为它实现了 from 的隐式方法TestTrait,所以您不需要重新声明implicit关键字:

object TestClass1 extends TestTrait {
  val test = (value: String) => value.toInt
}
于 2013-10-14T12:19:39.047 回答