第一个示例成功找到隐式转换为方法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
答案 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/,但找不到相关问题。