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

时间:2015-10-16 04:33:06

标签: 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
}

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这两种情况似乎属于the specification

的情况
  

视图适用于三种情况:

     

...

     

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

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