第一个例子成功地找到了隐式转换的方法foo(String)
,但只要我添加一个类型参数(见fails
)的编译已经不解决这个问题:为什么Scala隐式解析失败,因为带有类型参数的重载方法?
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
为什么你用同样的名字'foo'来装扮一个?也许这是显而易见的,但如果你把它叫做'bar',错误不会显示 –
我知道,但我想重载'foo' - 我刚更新了这个问题。 –