2012-11-01 29 views
18

为什么此代码在Scala 2.9.2中引发类型不匹配错误?我预计,getOrElse返回类型为String,但实际上它返回java.io.Serializable选项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("") 
              ^

这是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感谢修复我的英语! – sndyuk

回答

29

这是不完整的树遍历的不必要的情况下。 getOrElse的签名允许类型加宽,因此当它认识到String不是Option[String]时,它首先尝试填写getOrElse的不同类型归属,即Serializable。但现在它有"a".getOrElse[Serializable](""),它被卡住了 - 我不知道,在检查implicits之前,问题是让这个类型太笼统。

一旦你认识到这个问题,有一个修复:

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

现在打字员不漫步的let's-扩大路径,发现隐含的。