通常,我先写一个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进行测试。非常感谢!
答案 0 :(得分:11)
问题源于隐式FooWorker.list
没有显式声明的类型。如果您完成以下行:
implicit val list: List[String] = List("a", "b", "c")
无论声明的顺序如何,一切都按预期工作。通常,您应始终为隐式值指定显式类型。此规则将在Scala的未来版本中强制执行。
答案 1 :(得分:2)
这是一个开放的错误。
请参阅https://issues.scala-lang.org/browse/SI-5197(及相关/重复问题)。