20

为什么这段代码会在 Scala 2.9.2 中引发类型不匹配错误?我期望getOrElse返回类型String,但实际上它返回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("")
                                             ^

还行吧:

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)
4

1 回答 1

40

这是不完整的树遍历的不受欢迎的情况。的签名getOrElse允许类型扩大,因此当它意识到String不是时Option[String],它首先尝试在 上填写不同的类型归属getOrElse,即Serializable. 但是现在它有"a".getOrElse[Serializable]("")并且它被卡住了——我猜它没有意识到问题是在检查隐式之前使类型过于笼统。

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

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

现在打字机不会在 let's-widen 路径上徘徊,而是找到隐含的。

于 2012-11-01T22:47:11.883 回答