不同顺序的案例 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 的未来版本中强制执行。
通常,我会先写一个 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 的未来版本中强制执行。