scala - functions - Opción getOrElse tipo error de coincidencia
annotation scala (1)
¿Por qué este código genera un error de falta de coincidencia de tipo en Scala 2.9.2? getOrElse
que getOrElse
devuelva el tipo String
pero en realidad devuelve java.io.Serializable
:
scala> implicit def StringToOption(s:String) = Option(s)
StringToOption: (s: String)Option[String]
scala> "a".getOrElse("")
res0: String = a
scala> var opt:Option[String] = "a".getOrElse("")
<console>:8: error: type mismatch;
found : java.io.Serializable
required: Option[String]
var opt:Option[String] = "a".getOrElse("")
^
Esto esta bien:
scala> implicit def StringToOption(s:String): Option[String] = Option(s)
StringToOption: (s: String)Option[String]
scala> var b:Option[String] = "a".getOrElse("") toString
b: Option[String] = Some(a)
Es un caso no deseado de recorrido incompleto de árboles. La firma de getOrElse
permite la ampliación de tipos, por lo que cuando se da cuenta de que String
no es la Option[String]
, primero intenta completar una getOrElse
tipo diferente en getOrElse
, es decir, que se puede Serializable
. Pero ahora tiene "a".getOrElse[Serializable]("")
y está atascado: no se da cuenta, supongo, de que el problema era que el tipo fuera demasiado general antes de verificar las implicaciones.
Una vez que te das cuenta del problema, hay una solución:
"a".getOrElse[String]("")
Ahora el mecanógrafo no se desplaza por el camino que vamos a ensanchar y encuentra lo implícito.