Screaming Loud

日々是精進

Scalaの値クラスのバグ?

値クラスを使っていて不可解な挙動があったので、まとめたのとその対処法をメモしておきます。

値クラスとは

値クラスとはIntやStringが継承しているAnyValを継承させたクラスです。
一つの値しか持ちませんが拡張メソッドを実装できるため、DDDなどを実現するためのドメインモデルの記述に役立つ記法です。
値クラスと汎用トレイト - Scala Documentation

問題

コンパイル時の型は統一されていますが、実行時の型が不定という問題。

gist.github.com

上のように、コンパイル時の内部で保持している型は共にAttributesクラス(値クラス)なのですが、
実際に実行してみると、

  1. json4sから流し込んだ方:String型で保持
  2. 値クラスをそのままセット:Attributesクラスで保持

ということで、非常に不便な状況です。

対処法

対処法に関しては、単純にjson4sから流し込む部分は全てStringで受け、値クラスの方にはそのままセットするように作成しました。

まとめ

結局、Scala側の仕様なのかバグなのかよくわかりません。

元々値クラス自体、実行時に内部で保持している型を利用するという仕様なので使いやすいのですが、その評価がjson4sによっておかしくなるということでしょうか?

実行時の型が不安定というのは開発者としては、結構使いづらいのでそこの解決はお願いしたいですね。。

追記

このブログ公開後、速攻でお返事頂いたので、記載いたします。
結論json4sのバグのようでした。