我有两个案例类A和B.我需要有条件地创建Json对象
Json.toJson(if(cond)A else B)
if(cond)Json.toJson(A)else Json.toJson(B)
语句1不编译但语句2编译。这背后的原因是什么?
答案 0 :(得分:1)
toJson(...)
的签名是:
toJson[T](o: T)(implicit tjs: Writes[T]): JsValue
这意味着参数类型Writes
的范围必须有隐式T
。
现在,表达式 if (cond) A else B
的类型是各种类型的值A和B的常见超类型。
对于没有显式继承自同一基类的类型,常见的超类型将是Scala的Any
。 Writes
没有隐式Any
(因为什么是JSON表示什么?)所以在编译时你会得到一个“隐式未找到”错误。
另一方面,条件语句2的每个分支的计算结果为JsValue
,因此这是表达式的值。