Unboxed Tagged Types の落とし穴

ご存知の通り(?)以下のような血みどろなマサカリが飛び交っていましたが

twitter の bijection というライブラリの名前問題

まぁその話の本体についてはおいておいて、その副産物というか、そのpull request欄のコメントにて、面白い有用な話を見つけたのでメモ。


まず簡単に Unboxed Tagged Types について説明しておくと、1年ちょっと前に発見というか発明されて、現在はScalazとshapelessで使われています。(誤解を恐れずに)一言でいうと、
「Scala2.9以前でも、Scala2.10で入った、value classと似たようなことができる」
という感じです。詳しくは以下のetorreborreさんのblogとか読んでください。

で、Unboxed Tagged Types の落とし穴とは、その bijection の pull requestのコメント欄で、Scalazのコミッターでもあり、最近typesafeに入った retronymさんが言ってました。

https://github.com/twitter/bijection/pull/44#issuecomment-12089760

以下のようなことが起きます

まぁ偶然発見されたものだし、こんなことがあってもしょうがないですね。詳細な説明は面倒なので省きますが、簡単にいうと

  • JVMレベルで、プリミティブ型のArrayと参照型のArrayは互換性がない

というのと

  • Scalaの可変長引数の内部実装

により起こる現象だとおもわれます。


追記:

自分でもやってみたらそうなってました。2.9で発生する内部的な原因はたしかに上記に書いた2点ですが、2.10.0で発生しないのは

  • バグがなおったのか?
  • たまたま内部実装が変わって、例外が起きなくなったのか?

どっちなんでしょうね・・・。誰か詳しいこと知ってたら教えて下さい


https://github.com/scala/scala/pull/1891