首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >选项getOrElse类型不匹配错误

选项getOrElse类型不匹配错误
EN

Stack Overflow用户
提问于 2012-11-02 05:49:58
回答 1查看 11.4K关注 0票数 20

为什么这段代码会在Scala 2.9.2中引发类型不匹配错误?我期望getOrElse返回类型String,但实际上它返回的是java.io.Serializable

代码语言:javascript
复制
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("")
                                             ^

这是可以的:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-02 06:47:12

这是一种不需要的树遍历不完整的情况。getOrElse的签名允许类型扩展,因此当它意识到String不是Option[String]时,它首先尝试填充getOrElse上的另一个类型归属,即Serializable。但是现在它有了"a".getOrElse[Serializable](""),它被卡住了--我想,它没有意识到问题是在检查隐式之前把类型搞得太泛化了。

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

代码语言:javascript
复制
"a".getOrElse[String]("")

现在,typer不会沿着let-s加宽的路径漫步,而是找到隐式的。

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13186063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档