选项getOrElse类型不匹配错误

snd*_*yuk 19 scala type-mismatch implicit-conversion

为什么此代码会在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("")
                                             ^
Run Code Online (Sandbox Code Playgroud)

还行吧:

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)
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 37

这是一个不完整的树遍历的不需要的情况.签名getOrElse允许类型扩展,所以当它意识到它String不是Option[String]它首先尝试填写不同类型的归属getOrElse,即Serializable.但是现在它已经存在"a".getOrElse[Serializable]("")并且它被卡住了 - 我猜,它没有意识到问题是在检查暗示之前使类型过于笼统.

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

"a".getOrElse[String]("")
Run Code Online (Sandbox Code Playgroud)

现在,typer并没有沿着我们扩大的道路漫步,而是发现隐含的.