【问题标题】:Could not find implicit when used in main method在 main 方法中使用时找不到隐式
【发布时间】:2018-06-17 17:41:09
【问题描述】:

我有类似于以下摘录的代码:

object Obj {
  case class Dog(colour: String= "brown")

  def summon(dog: Dog = Dog()): Dog = dog

  def getColour(implicit d: Dog): String = d.colour

  def main(args: Array[String]): Unit = {
    implicit val dog = summon(Dog(colour = "orange"))

    val colour = getColour
  }
}

这不会编译,因为编译器在调用getColour 时找不到参数d 的隐式狗。不过奇怪的是,如果我尝试将getColour 的结果分配给一个名为colour 以外的名称的val,它会起作用。此外,如果我将 2 行移出 main 方法,它也可以正常工作。任何想法是什么导致隐式解决在这里失败?

我使用的是 Scala 版本 2.12.6。

【问题讨论】:

  • 有趣!如果您将这一行 implicit val dog = summon(Dog(colour = "orange")) 替换为这一行 implicit val dog = summon(Dog("orange")) ,它将起作用。也许您可以提交一份错误报告。 :)
  • 如果您明确声明dog: Dog 的类型,它也适用于colour。什么!!!^^

标签: scala implicit


【解决方案1】:

如果我们像这样删除implicit

  def main(args: Array[String]): Unit = {
    val dog = summon(Dog(colour = "orange"))
    val colour = getColour(dog) // error: recursive value dog needs type
  }

我们得到recursive value dog needs type,所以我相信这是一个

https://issues.scala-lang.org/browse/SI-5091

【讨论】:

  • 有道理。未解决的隐含似乎隐藏了根本问题。还有一张 sbt (github.com/sbt/sbt/issues/1928) 的公开票,它显然隐藏了作为 SI-5091 的一部分添加的警告消息。
猜你喜欢
  • 2015-06-02
  • 2021-10-24
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多