Por que essa chamada explícita de um método Scala permite que ele seja implicitamente resolvido?
Por que esse código falha na compilação, mas é compilado com êxito quando descomente a linha indicada? (Estou usando o Scala 2.8 todas as noites). Parece que chamar explicitamentestring2Wrapper
permite que seja usado implicitamente a partir desse ponto.
class A {
import Implicits.string2Wrapper
def foo() {
//string2Wrapper("A") ==> "B" // <-- uncomment
}
def bar() {
"A" ==> "B"
"B" ==> "C"
"C" ==> "D"
}
object Implicits {
implicit def string2Wrapper(s: String) = new Wrapper(s)
class Wrapper(s: String) {
def ==>(s2: String) {}
}
}
}
Editar: obrigado pelas respostas até agora, que incluem um ponteiro para o comentário de Martin Odersky,
"Uma conversão implícita sem tipo de resultado explícito é visível apenas no texto que segue sua própria definição. Dessa forma, evitamos os erros de referência cíclica".
Eu ainda estaria interessado em descobrir 1) qual é o perigo de "erros de referência cíclica"? E 2) Por que uma chamada explícita faz alguma diferença?