作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么要玩-json Reads
trait 未声明为协变:
trait Reads[+A]
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.blah
和
Main.blah
发生了什么?前者使用
Baz.reads
,后者使用
Foo.reads
,因为(复杂的)隐式解析顺序。
Foo
的东西”和“可以将 JSON 解析为所有可能的
Foo
的东西”之间的区别。
关于scala - 为什么 Reads 没有声明为协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567572/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!