选项getOrElse类型不匹配错误

时间:2012-11-01 21:49:58

标签: scala implicit-conversion type-mismatch

为什么此代码会在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)

1 个答案:

答案 0 :(得分:36)

这是一个不完整的树遍历的不需要的情况。 getOrElse的签名允许类型扩展,因此当它意识到String不是Option[String]时,它首先尝试在getOrElse上填写不同类型的归属,即{{1} }}。但是现在它已经Serializable并且它被卡住了 - 我想,它没有意识到问题是在检查隐含之前使类型过于笼统。

一旦你意识到这个问题,就有了解决办法:

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

现在,typer并没有沿着我们扩大的路径漫步,而是找到了隐含的。