¿Por qué este código no puede compilarse, pero se compila correctamente cuando elimino el comentario de la línea indicada? (Estoy usando Scala 2.8 todas las noches). Parece que llamar explícitamente al string2Wrapper
le permite ser utilizado implícitamente desde ese momento.¿Por qué esta llamada explícita de un método de Scala permite que se resuelva implícitamente?
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: Gracias por las respuestas hasta el momento, que incluyen un puntero al comentario de Martin Odersky,
"Una conversión implícita y sin tipo de resultado explícito es visible sólo en el texto tras su propia definición. De esta forma, evitamos los errores de referencia cíclicos ".
Todavía estaría interesado en descubrir 1) ¿cuál es el peligro de "errores de referencia cíclicos" ?, y 2) ¿Por qué una llamada explícita hace alguna diferencia?
Es (se supone que debe ser) spec'ed. Paulp ha desenterrado un boleto a tal punto muy recientemente. Déjame ver si yo no lo encuentro ... –
aquí: https://lampsvn.epfl.ch/trac/scala/ticket/801 –