2012-11-01 31 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-擴大路徑,發現隱含的。