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に上がっておった。
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
せめて変更の理由はどっかに書いて欲しいなあ。