val c: Option[Int] = None
val temp = c.getOrElse(0)
play.api.libs.json.JsNumber( temp ) //1
play.api.libs.json.JsNumber( c.getOrElse(0) ) //2
为什么1编译,而2给出类型不匹配(找到:Any,required:BigDecimal)?
答案 0 :(得分:4)
由于JsNumber
需要BigDecimal
,当您temp
感染为Int
时,隐式转化会将其更改为BigDecimal
并且有效。< / p>
当你说
时JsNumber(c getOrElse 0)
在预期BigDecimal
的地方,我的猜测是0
转换为BigDecimal
以匹配参数类型
JsNumber(c getOrElse BigDecimal(0))
但是getOrElse
的签名说
getOrElse[B >: A](default: ⇒ B): B
Int
和BigDecimal
的最具体的常见超类型是Any
。电话看起来或多或少是这样的:
JsNumber((None: Option[Int]) getOrElse (BigDecimal(0): Any))
这会导致将Any
传递到预期的BigDecimal
。
可能的解决方案是自己注释类型
JsNumber((c getOrElse 0) : Int)
或使用BigDecimal
代替Int
JsNumber((None: Option[BigDecimal]) getOrElse 0)