为什么这段代码会在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)
发布于 2012-11-02 06:47:12
这是一种不需要的树遍历不完整的情况。getOrElse
的签名允许类型扩展,因此当它意识到String
不是Option[String]
时,它首先尝试填充getOrElse
上的另一个类型归属,即Serializable
。但是现在它有了"a".getOrElse[Serializable]("")
,它被卡住了--我想,它没有意识到问题是在检查隐式之前把类型搞得太泛化了。
一旦你意识到这个问题,有一个解决办法:
"a".getOrElse[String]("")
现在,typer不会沿着let-s加宽的路径漫步,而是找到隐式的。
https://stackoverflow.com/questions/13186063
复制相似问题