Rob*_*een 6 scala subtype argonaut
在Argonaut DecodeJson特性中,存在一种|||将解码器链接在一起的方法,从而选择第一个后续解码器.还有一种类似的方法DecodeResult具有相同的效果.乍一看,好像其中一个是我们想要解码共同特征的多个子类型的东西.但是,我们如何实际做到这一点?
第一个问题是,参数|||必须是DecodeJson解码被调用者应该解码的类型的超类型(并且类似地DecodeResult).我希望这样的解码器能够解码常见超类型的所有子类型,所以这似乎是无限递归的一个秘诀!
asInstanceOf在定义CodecJson超类型时,我们可以使用以下丑陋的黑客来解决这个问题:
c => c.as[A] ||| c.as[Foo](implicitly[DecodeJson[B]].asInstanceOf[DecodeResult[Foo]])
Run Code Online (Sandbox Code Playgroud)
但是,当解码两个以上的子类型时仍然存在问题.假设有亚型A,B和C的Foo.现在怎么样?我们如何为这个解码表达式添加另一种替代方案?.asInstanceOf[DecodeResult[AnyRef]]将破坏解析结果的类型安全性(好像我们此时尚未丢弃类型安全性!).然后我们很快就会用掉4,5或6种替代方案.
编辑:我很乐意接受使用Argonaut解码超过2宽子类型层次结构的任何替代方法作为答案.
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |