2

通常,我先在同一个文件中写 a case class,然后是同伴object,就在下面。但是当试图implicit在同伴中导入声明时,我不得不切换声明的顺序(显然我不想要)。克服这种情况的推荐做法是什么?

对于具体情况,以下代码不起作用:

  object SomeLib {
     def doSomething[T : List](t: T) = "meh"
  }

  case class FooWorker(x: String) {
    import FooWorker._ // bring the implicit in scope for doSomething
    def then(event: String) : FooWorker = {
      copy(x = SomeLib.doSomething(event)) // requires implicit
    }
  }

  object FooWorker {
    implicit val list = List("a", "b", "c")
  }

但是,如果我在它起作用object FooWorker之前声明。case class FooWorker我正在使用 Scala 2.11.6 和 SBT 进行测试。非常感谢!

4

2 回答 2

11

问题源于隐式FooWorker.list没有显式声明的类型这一事实。如果您完成以下内容:

implicit val list: List[String] = List("a", "b", "c")

无论声明的顺序如何,一切都按预期工作。通常,您应该始终为隐式值提供显式类型。此规则将在未来版本的 Scala 中强制执行。

于 2015-08-20T21:46:30.677 回答
2

这是一个开放的错误。

请参阅https://issues.scala-lang.org/browse/SI-5197(以及相关/重复问题)。

于 2015-08-20T14:41:08.140 回答