scala - resueltos - estadistica elemental resumen
¿Por qué este tipo de conversión implícita es ilegal? (1)
Ok, vamos a empezar con el principio, ¿por qué falla en el primer caso:
- Intenta definir un método implícito que transforma una
String
en unInt
y, para hacerlo, se llama atoInt
. - Desafortunadamente,
toInt
no es parte de la claseString
. Por lo tanto, el compilador necesita encontrar un implícito para convertirstr
en algo que tenga un métodotoInt:Int
. - Afortunadamente,
Predef.augmentString
convierte unString
en unStringOps
, que tiene tal método. - Pero el tipo
Int
también tiene un método de este tipo y AS define un tipo de retorno, el métodostrToInt2
puede llamarse recursivamente, y como el método es implícito, puede aplicarse para transformar algo con una funcióntoInt:Int
- El compilador no sabe qué método implícito usar (entre el suyo y
Predef.augmentString
y arroja un error.
En el segundo caso, al omitir el tipo de retorno, la función strToInt2
no puede ser recursiva, y ya no hay dos candidatos para transformar la String
.
PERO si después de esta definición, intenta: "2".toInt
, el error está de vuelta: ahora tienes dos formas de obtener algo con una función toInt:Int
cuando tienes una String
.
Escribo la siguiente conversión implícita en scala:
implicit def strToInt2(str: String):Int = {
str.toInt
}
Pero se levanta este error de compilación:
<console>:9: error: type mismatch;
found : str.type (with underlying type String)
required: ?{val toInt: ?}
Note that implicit conversions are not applicable because they are ambiguous:
both method augmentString in object Predef of type (x: String)scala.collection.
immutable.StringOps
and method toi in object $iw of type (str: String)Int
are possible conversion functions from str.type to ?{val toInt: ?}
str.toInt
^
Si elimino el tipo de retorno, simplemente lo declaro así:
implicit def strToInt2(str: String) = {
str.toInt
}
Se compila con éxito. ¿Alguien puede decirme cuál es la diferencia entre los dos?