案例类和伴侣的不同顺序的隐式解决方案

时间:2015-08-19 22:21:55

标签: scala implicit case-class companion-object context-bound

通常,我先写一个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进行测试。非常感谢!

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

这是一个开放的错误。

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