【问题标题】:Implicit resolution for different orders of case class and companion不同顺序的案例类和同伴的隐式解析
【发布时间】:2015-11-13 09:48:34
【问题描述】:

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

【问题讨论】:

  • @TravisBrown 我没有使用 REPL。我有一个 sbt 项目,里面有一个 Main.scala 文件和一个简单的驱动程序来测试它。我直接从控制台运行它(即sbt run)。

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


【解决方案1】:

这是一个开放的错误。

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

【讨论】:

    【解决方案2】:

    问题源于隐式FooWorker.list 没有显式声明的类型。如果您填写以下内容:

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

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

    【讨论】:

    • 非常感谢,这解决了问题。出于好奇:为什么显式键入会改变这种情况?在类型已知(显式或推断)之后,隐含的问题不是解决了吗?
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多