隐式参数需要类型注解才能编译

Implicit parameter need Type annotation to compile

这是我的测试代码:

object ImplicitTest {
  import JoesPrefs._
  Greeter.greet("Joe") // could not find implicit value for parameter prompt: 
}
class PreferredPrompt(val preference: String)

object JoesPrefs {
  implicit val prompt = new PreferredPrompt("Yes, master> ")
}
object Greeter {
  def greet(name: String)(implicit prompt: PreferredPrompt) = {
    println("Welcome, " + name + ". The system is ready.")
    println(prompt.preference)
  }
}

我使用 scala 2.11.12,不知道为什么这个隐式不起作用,直到将类型注释添加到 val :

object JoesPrefs {
  implicit val prompt: PreferredPrompt  = new PreferredPrompt("Yes, master> ")
}

所以,确切的内部有点乱,但基本上归结为代码的编译顺序。 当您添加类型注释时,val 比您不添加时更快地“编译并放入范围”,并且可以在 ImplicitTest 中解析。

有趣的是(至少对我而言 ^^),您还可以将 ImplicitTest 移动到 JoesPref 对象之后的一行代码中(或将其移动到它自己的文件中),它将在没有类型注释的情况下进行编译。