2012-11-01 10 views
18

Perché questo codice genera un errore di mancata corrispondenza di tipo in Scala 2.9.2? Mi aspettavo che getOrElse restituisce il tipo String ma in realtà restituisce java.io.Serializable:Errore di mancata corrispondenza tipo getOrElse

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("") 
              ^

Questo è OK:

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) 
+0

> sschaef Grazie per risolvere il mio inglese! – sndyuk

risposta

29

Si tratta di un caso di indesiderato incompleta attraversamento di alberi. La firma di getOrElse consente di ampliare il tipo, quindi quando si rende conto che String non è Option[String], tenta innanzitutto di inserire un'ascrizione di tipo diverso su getOrElse, ad esempio Serializable. Ma ora ha "a".getOrElse[Serializable]("") ed è bloccato - non si rende conto, credo, che il problema fosse rendere il tipo troppo generale prima di verificare impliciti.

Una volta compreso il problema, c'è una soluzione:

"a".getOrElse[String]("") 

Ora la macchina per scrivere non passeggiare lungo la Mettiamoci-allargare percorso, e trova l'implicito.