Das erste Beispiel findet erfolgreich die implizite Umwandlung in das Verfahren foo(String)
aber sobald ich einen Typ-Parameter (siehe fails
) in dem compiliert es nicht mehr beheben:Warum schlägt die implizite Scala-Auflösung für eine überladene Methode mit dem Typparameter fehl?
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
}
Dieses Verhalten ist für Scala 2.11.7 und 2.12.0-M3.
Die Dokumentation zu implicits scheint das nicht zu decken und ich genau diesen Fall nicht auf Stackoverflow finden.
Beachten Sie, dass es mein Ziel, die Methode zu überlasten ist foo
- wenn ich es umbenennen, der Compiler es findet.
http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html
Warum verwenden Sie den gleichen Namen 'foo' für die kuppelte ein? Vielleicht ist es offensichtlich, aber wenn Sie es 'bar' nennen, manifestiert sich der Fehler nicht –
Ich weiß, aber ich will' foo' überladen - ich habe gerade die Frage aktualisiert. –