Il primo esempio rileva correttamente la conversione implicita al metodo foo(String)
, però non appena aggiungo un parametro di tipo (vedi fails
) le compilazioni non risolve faccio più:Perché la risoluzione implicita di Scala non riesce per il metodo sovraccaricato con il parametro type?
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
}
Questo comportamento è lo stesso per Scala 2.11.7 e 2.12.0-M3.
La documentazione sugli impliciti non sembra coprire questo problema e non ho trovato questo caso esatto su StackOverflow.
Si noti che il mio obiettivo è di sovraccaricare il metodo foo
- se lo si rinomina, il compilatore lo trova.
http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html
Perché stai usando lo stesso nome 'foo' per il pimpato? Forse è ovvio, ma se lo chiami 'bar' l'errore non si manifesta –
Lo so, ma voglio sovraccaricare' foo' - Ho appena aggiornato la domanda. –