【发布时间】:2017-07-09 11:13:58
【问题描述】:
我有两个case类A和B,我需要有条件地创建Json对象
Json.toJson(if (cond) A else B)
if (cond) Json.toJson(A) else Json.toJson(B)
语句 1 不能编译,但语句 2 可以。这背后的原因是什么?
【问题讨论】:
标签: json scala playframework
我有两个case类A和B,我需要有条件地创建Json对象
Json.toJson(if (cond) A else B)
if (cond) Json.toJson(A) else Json.toJson(B)
语句 1 不能编译,但语句 2 可以。这背后的原因是什么?
【问题讨论】:
标签: json scala playframework
toJson(...)的签名是:
toJson[T](o: T)(implicit tjs: Writes[T]): JsValue
这意味着参数类型T 的范围内必须有一个隐式Writes。
现在,表达式if (cond) A else B的类型是值A和B各自类型的公共超类型。
对于没有显式继承自同一个基类的类型,常见的超类型将是 Scala 的Any。 Any 没有隐含的 Writes(因为任何东西的 JSON 表示形式是什么?)所以你会在编译时得到一个“隐式未找到”错误。
另一方面,语句 2 中条件的每个分支的计算结果为 JsValue,因此这就是表达式的值。
【讨论】: