在 ArgonautDecodeJson
特征中,有一种|||
将解码器链接在一起的方法,以便选择第一个后续解码器。还有一种类似的方法DecodeResult
具有相同的效果。乍一看,其中一个似乎是我们想要解码一个共同特征的多个子类型的东西。但是,我们实际上如何做到这一点?
第一个问题是 to 的参数|||
必须是DecodeJson
解码被调用者应该解码的类型的超类型(对于 也是类似的DecodeResult
)。我希望这样的解码器能够解码通用超类型的所有子类型,所以这似乎是无限递归的秘诀!
我们可以在定义超类型时使用以下丑陋的asInstanceOf
技巧来解决这个问题:CodecJson
c => c.as[A] ||| c.as[Foo](implicitly[DecodeJson[B]].asInstanceOf[DecodeResult[Foo]])
但是,当解码两个以上的子类型时,仍然存在问题。假设有子类型A
和。现在呢?我们如何为这个解码表达式添加另一个替代方案?将破坏解析结果的类型安全(好像我们此时还没有丢弃类型安全!)。然后我们很快就会用完 4、5 或 6 个备选方案。B
C
Foo
.asInstanceOf[DecodeResult[AnyRef]]
编辑:我很乐意接受使用 Argonaut 解码超过 2 个宽的子类型层次结构的任何替代方法作为答案。