第一個例子成功地找到了隱式轉換的方法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' - 我剛更新了這個問題。 –