6

ArgonautDecodeJsonトレイトには、デコーダーを連鎖させる方法があり、|||後続の最初のデコーダーが選択されます。同様の効果を持つ同様の方法もありDecodeResultます。一見すると、これらのうちの 1 つが、共通の特性の複数のサブタイプをデコードするために必要なもののように見えます。しかし、実際にこれを行うにはどうすればよいでしょうか。

最初の問題は、 への引数が、呼び出し先がデコードすることになっている型のスーパータイプをデコードする必要があることです ( についても同様です|||) 。そのようなデコーダーは、共通のスーパータイプのすべてのサブタイプをデコードできると期待しているので、これは無限再帰のレシピのようです!DecodeJsonDecodeResult

スーパータイプasInstanceOfの を定義する際に、次の醜いハックを使用してこれを回避できます。CodecJson

c => c.as[A] ||| c.as[Foo](implicitly[DecodeJson[B]].asInstanceOf[DecodeResult[Foo]])

ただし、3 つ以上のサブタイプをデコードする場合は、まだ問題があります。サブタイプABおよびCがあるとしFooます。今何?このデコード式にさらに別の代替手段を追加するにはどうすればよいでしょうか? .asInstanceOf[DecodeResult[AnyRef]]解析結果の型安全性を破壊しようとしています (この時点で型安全性を破棄していないかのように!)。そして、選択肢が 4 つ、5 つ、または 6 つあるとすぐに選択肢がなくなります。

EDIT : Argonaut を使用して 2 幅を超えるサブタイプ階層をデコードするための代替アプローチを回答として喜んで受け入れます。

4

0 に答える 0