gpt4 book ai didi

scala - 为什么 Reads 没有声明为协变?

转载 作者:行者123 更新时间:2023-12-04 02:09:49 28 4
gpt4 key购买 nike

为什么要玩-json Reads trait 未声明为协变:

trait Reads[+A] 

相关要点: https://gist.github.com/robertberry/9410272

协方差/逆变会干扰隐式吗?

或者可选地,如何写 Reads密封特征的实例? https://gist.github.com/phadej/c60912802dc494c3212b

最佳答案

它可能是协变的,尤其是当您将 Reads[A] 视为更丰富的 JsValue => A 形式时。

但是......隐含。
Reads[A] 不仅是 JsValue 转换为 A 的方式,它还是 的方式。

所以如果我们有

sealed trait Foo
case class Bar(a: Int)
case class Baz(b: Int)

如果你定义了一个 Reads[Bar] ,你也会(协方差)有一个 Reads[Foo]

这可能有点奇怪。
object Foo {
implicit reads: Reads[Foo] =
implicitly[Reads[Bar]].orElse[implicitly[Reads[Baz]]]
}
object Bar {
implicit reads = Json.reads[Bar] // {"a":0}
}
object Baz {
implicit reads = Json.reads[Baz] // {"b":0}

def blah(jsValue: JsValue): Foo = jsValue.as[Foo]
}
object Main {
def blah(jsValue: JsValue): Foo = jsValue.as[Foo]
}
Baz.blahMain.blah 发生了什么?前者使用 Baz.reads ,后者使用 Foo.reads ,因为(复杂的)隐式解析顺序。

这是一个边缘情况,我仍然认为你可以为协方差提出一个很好的论据,但它确实显示了“可以将 JSON 解析为 Foo 的东西”和“可以将 JSON 解析为所有可能的 Foo 的东西”之间的区别。

关于scala - 为什么 Reads 没有声明为协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567572/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com