scala - Scala 选项getOrElse类型不匹配错误

  显示原文与译文双语对照的内容
107 0

为什么这里代码在 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)



时间: 原作者:

64 5

这是不完全树遍历的一个不需要的例子。 getOrElse 签名允许类型扩大,因此当它意识到 String 不是 Option[String] 时,首先尝试在 getOrElse 上填充另一种类型的归属:换句话说,/。 但现在它有 "a".getOrElse[Serializable]("") 并且它是stuck--it并没有意识到,问题在于在检查implicits之前类型太常规。

一旦发现问题,就有了解决方法:


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



现在typer不会沿着,的扩展路径进行移动,并找到隐式的路径。

原作者:
...