특히 Reads[A]
을 더 부유 한 형태의 JsValue => A
으로 볼 때 공분산 될 수 있습니다.
하지만 .... implicitness.
Reads[A]
뿐만 아니라 단지 A
에 JsValue
에서 변환하는 방법, 그것은 방법입니다.
그래서 당신이 Reads[Bar]
을 정의한 경우 우리가
sealed trait Foo
case class Bar(a: Int)
case class Baz(b: Int)
이 있다면, 당신은 또한 (공분산)와 함께
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
을 사용합니다.
이것은 가장 중요한 사례이며, 여전히 공분산에 대한 좋은 논거를 할 수 있다고 생각하지만, "JSON을 구문 분석 할 가능성이 있습니다 (Foo
)"와 "JSON을 모두 구문 분석 할 수있는 것 가능 Foo
".
감사합니다. 내 생각에 암시가있는 경우입니다. 당신은 요점에 대해 논평 할 수 있습니까? 당신이 생각하기에,''[Child] .map (x => x)'또는'[Child] .as [Reads [Parent]]'라고 쓰면, 후자에서 뭔가 잘못 될 수 있습니까? – phadej
@phadej,'.asInstanceOf'를 의미합니까? 어쨌든, 나는 타입을 확장하는 것에 나쁜 것이 있다고 생각하지 않는다. 유일한 문제는 암시에 대해 자동으로 수행되는 경우입니다. –