2012-11-01 9 views
18

Warum löst dieser Code in Scala 2.9.2 einen Typenkonfliktfehler auf? Ich erwartete, dass getOrElse kehrt Typ String aber tatsächlich gibt es java.io.Serializable:Option getOrElse type Mismatch error

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

Das OK ist:

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 Danke mein Englisch zu beheben! – sndyuk

Antwort

29

Es ist ein unerwünschter bei unvollständiger Baumdurchlauf. Die Signatur von getOrElse ermöglicht eine Typerweiterung, so dass, wenn erkannt wird, dass String nicht Option[String] ist, zuerst versucht wird, eine andere Typenbezeichnung auf getOrElse, d. H. Serializable, einzufügen. Aber jetzt hat es "a".getOrElse[Serializable]("") und es ist stecken geblieben - es erkennt nicht, ich denke, dass das Problem war, den Typ zu allgemein zu machen, bevor man nach implicits sucht.

Wenn Sie das Problem erkennen, gibt es ein fix:

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

Nun ist die typer nicht die Lass-verbreitern nicht wandern hinunter Weg und findet die implizite.

Verwandte Themen