Scala2.12とtraitとバイナリ互換

最近いろいろあってあまりblog書けてないです、こんにちは。

そんなことはどうでもいいですね、さっさと標題の話に入りましょう。


10ヶ月くらい前に、以下のような記事書きましたが


Scalaでtraitにメソッド追加するとバイナリ互換壊れるけどabstract classだと壊れないという例

Scala2.12で、Java8のinterfaceのデフォルトメソッド機能使うようになったら変わるんでしょうか。

最近のScala2.12のM4やM5あたりから、traitでJava8のデフォルトメソッド使ってエンコードするようになってきたので、改めて、以前使ったプロジェクトをScala 2.12.0-M5に変えて試してみました。


結論としては、(少なくとも以前実験したパターンでは)
バイナリ互換壊れませんでした!!!めでたい??!!! *1

どういうパターンだと壊れないのか、結局壊れるパターンもありえるのか?(複雑にmixinした場合とか?)は、よくわかっていませんが、今のところScala 2.11以前よりもバイナリ互換壊れにくくなりそう、というのは言えそうです。
ただ、(traitのメソッド関連以外でも)逆に今までバイナリ互換壊れなかったのに、壊れてしまうパターンがでてきた、というのがゼロとは言い切れない?ので、単純に喜んでいいのかどうかわかりません。

あと、もうすぐ2.12.0-RC1が出るはずですが、2.12.0-M5が出たあともわりとtraitのメソッド関連のバイトコードに関するコンパイラのコード変えていたはずなので、最終的な結果はまた異なる可能性もゼロではありません。

というわけで、今もっと詳細に調べて2.12.0 finalが出た後に微妙に変わって、調べたものが無駄になるの嫌なので、ひとまずこのくらいにしておきます。

*1:最初貼った以下のリンク間違ってたので貼り直した