DevDevデブ!!

プログラミングのこととか書きます。多分。。。

play-jsonの2.8でWritesが非変になっててハマった話

表題が全てなんですけど、play-jsonのWritesは2.7まで反変だったんですが、2.8から非変になってます。

そのせいでplay2.7から2.8に更新したタイミングでコンパイルエラーが出るようになりました。

ことのあらまし

今年scala3出るらしいし、scalaもplayもバージョン更新せんとなーと思って更新作業をしてました。

scala2.12 + play2.6 -> scala2.13 + play2.7 -> scala2.13 + play2.8

コンパイルユニットテストが通ることを確認しながらバージョンを上げていったんですが、play2.8に上げたタイミングでコンパイルエラーが発生。

Json.toJsonしてるところで、implicit parameterが見つからないと言われる。そんな馬鹿な。

Json.toJsonしてるとこ全てでエラーが出るわけではなく、Writesを親クラスで定義してるやつだけエラーが出ていました。

Writesが非変になってるのが原因

issueに上がっておった。

github.com

Writesが非変になっているのが原因だった。

うん、この変更リリースノートに記載ないよな?つーかどういった理由で非変にしたんだ???

(コミットコメントには「非変にした」とか記載されてなかった)

例えば

case class Hoge extends SuperHoge

ってあったとき、play2.7までならSuperHogeにWritesが定義されてれば、HogeにはWritesが定義されてなくてもJson.toJsonすることができた。

Writes[Hoge]の代わりにWrites[SuperHoge]が使えるから。

2.8ではWritesが非変になったことでそれができなくなっている。

対処方法

いちおう、Json.toJson(hoge.instanceOf[SuperHoge])と親クラスにキャストすることでいける。

ていうかうちのケースだと、テストケースでしか使ってなかったからとりあえずこれで対応した。

感想

型パラメータを反変から非変に変更するのは結構なbreaking changeだと思うんですけどwwww

せめて変更の理由はどっかに書いて欲しいなあ。