为什么Scala隐式解析对于带有类型参数的重载方法失败?

Mic*_*ier 7 scala type-conversion implicits

第一个示例成功找到了对方法的隐式转换foo(String),但是只要我添加一个类型参数(请参阅fails参考资料),编译就不再解析它了:

object works {
  class A {
    def foo(): String = ???
  }
  implicit class PimpedA(a: A) {
    def foo(i: String): String = ???
  }
  val a = new A()
  a.foo("test") //compiles
}

object fails { //same as `works`, but adds type parameter
  class A {
    def foo[T](): String = ???
  }
  implicit class PimpedA(a: A) {
    def foo[T](i: String): String = ???
  }
  val a = new A()
  PimpedA(a).foo("test") // compiles
  a.foo("test") // error: too many arguments for method foo: ()String
}
Run Code Online (Sandbox Code Playgroud)

Scala 2.11.7和2.12.0-M3的行为相同.

关于implicits的文档似乎没有涵盖这一点,我没有在stackoverflow上找到这个确切的情况.

请注意,我的目标是重载该方法foo- 如果我重命名它,编译器会找到它.

http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html

Ale*_*nov 1

这两种情况似乎都属于规范的这种情况:

视图在三种情况下应用:

...

在类型e.m(args)为的选择中,如果选择器表示 的某些成员,但这些成员都不适用于参数。在这种情况下,将搜索适用于且其结果包含适用于 的方法的视图。搜索按照隐式参数的情况进行,其中隐式范围是 之一。如果找到这样的视图,则选择将转换为.eTmTargsvemargsTe.mv(e).m(args)

所以它应该有效。T我实际上很惊讶地看到它,因为我以前从未遇到过工作案例,并且假设如果有任何名为 的成员,则不会进行隐式搜索m。我快速浏览了http://issues.scala-lang.org/,但找不到相关问题。