Play Framework JsNumber参数转换为Any类型

时间:2016-05-07 08:18:56

标签: scala playframework

    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)?

1 个答案:

答案 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

IntBigDecimal的最具体的常见超类型是Any。电话看起来或多或少是这样的:

JsNumber((None: Option[Int]) getOrElse (BigDecimal(0): Any))

这会导致将Any传递到预期的BigDecimal

可能的解决方案是自己注释类型

JsNumber((c getOrElse 0) : Int)

或使用BigDecimal代替Int

JsNumber((None: Option[BigDecimal]) getOrElse 0)