2015-10-16 18 views
7

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

+0

Perché stai usando lo stesso nome 'foo' per il pimpato? Forse è ovvio, ma se lo chiami 'bar' l'errore non si manifesta –

+0

Lo so, ma voglio sovraccaricare' foo' - Ho appena aggiornato la domanda. –

risposta

1

In entrambi i casi sembrano rientrare in questo caso di the specification:

Visualizzazioni vengono applicate in tre situazioni:

...

In una selezione e.m(args) con e di tipo T, se il selettore m indica alcuni membri di T, ma nessuno di questi membri è applicabile agli argomenti args. In questo caso viene ricercata una vista v applicabile a e e il cui risultato contiene un metodo m applicabile a args. La ricerca procede come nel caso dei parametri impliciti, dove l'ambito implicito è quello di T. Se viene trovata tale vista, la selezione e.m viene convertita in v(e).m(args).

Quindi dovrebbe funzionare. Sono stato davvero sorpreso di vederlo, perché non ho mai incontrato il caso di lavoro prima e ho supposto che non ci sia una ricerca implicita se T ha membri chiamati m. Ho dato uno sguardo veloce a http://issues.scala-lang.org/, ma non sono riuscito a trovare un problema rilevante.

+0

Grazie Alexey. Ho creato un problema su scala-lang jira: https://issues.scala-lang.org/browse/SI-9523 –

+0

output di debug di typer: https://gist.github.com/echojc/750ba177f88f4e81d2d0 –