不同顺序的案例 class 和同伴的隐式解析

Implicit resolution for different orders of case class and companion

通常,我会先写一个 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")
  }

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

这是一个未解决的错误。

参见 https://issues.scala-lang.org/browse/SI-5197(和 related/duplicate 个问题)。

问题源于隐式 FooWorker.list 没有显式声明的类型。如果您完成以下行:

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

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