为什么此代码会在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)
答案 0 :(得分:36)
这是一个不完整的树遍历的不需要的情况。 getOrElse
的签名允许类型扩展,因此当它意识到String
不是Option[String]
时,它首先尝试在getOrElse
上填写不同类型的归属,即{{1} }}。但是现在它已经Serializable
并且它被卡住了 - 我想,它没有意识到问题是在检查隐含之前使类型过于笼统。
一旦你意识到这个问题,就有了解决办法:
"a".getOrElse[Serializable]("")
现在,typer并没有沿着我们扩大的路径漫步,而是找到了隐含的。