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并没有沿着我们扩大的道路漫步,而是发现隐含的.
| 归档时间: |
|
| 查看次数: |
10033 次 |
| 最近记录: |