generic functions annotation scala implicit-conversion type-mismatch

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.