Scala 2.10.0 では implicit value class の implicit の優先順位付けが不可能な件

言われるまで気づかなかったし、他にこの件について言ってる人を(少なくとも自分は)見たことないけど、わりと重要ですね。単なる「implicit class」ではなく、「implicit classとvalue classを同時に使った場合」というのがポイントです。以下解説

  1. implicit class は(実装的には "implicit def" と "class の定義" なので) トップレベルに定義できない(classやobjectの中に定義)*1
  2. value class は、トップレベルもしくは、objectの中でないと定義できない*2
  3. implicit の優先順位付け*3は、継承でしか制御できない


1と2を合わせると、
「implicit value class」は、objectの中にしか定義できない
そして、3の条件が重なると、

implicit value class の implicit の優先順位付けが不可能

ですよね・・・?

value class使って、かつ優先順位付けしたい場合は、「implicit value class」ではなく「value class」と「implicit def」に分けるしかないってことかな・・・。

なにか間違ってたり、良い解決策あったら教えて下さい

*1:REPLでは、トップレベルに定義できるようにみえますが、あれは暗黙的に作られたobjectの中に定義されています

*2:classやtraitの中はダメ

*3:親で定義されたimplicit defのほうが、優先順位低くなる。Scala標準ライブラリでも、PredefLowPriorityImplicitsで、そのテクニックが使われている。Scalazは、implicitの優先順位付けのためだけに、traitを10個以上重ねている場合がある