読者です 読者をやめる 読者になる 読者になる

ScalaのClassManifestについてハマった(未解決)

JVMの型パラメータは、型消去によって実現されているため、通常実行時に型パラメータの情報を取得することはできません。

ですが、Scalaには「ClassManifest」というトレイトがあり、それを利用することで型消去によって消えてしまった型情報を取得することができるようになります!


ですが、以下の実装をしたとき、私が想定している動きをしてくれませんでした。

なにを想定していて、どこが想定と違ったか

上の .scala ファイルを実行すると、以下の結果が帰ってくることを想定していました。

> scala classmanifesttest.scala
java.lang.String
int

コンパニオンオブジェクトでは、ClassName[A]クラスを2種類の方法で生成しており、想定では、toStringの結果はどちらで生成しても同じく型パラメータのクラス名が帰ってくるものだと思っていました。

ですが実際は、実行結果が違うどころかコンパイルすら出来ていないようです。

/Users/rabitarochan/workspace/classmanifest.scala:10: error: type mismatch;
 found   : java.lang.Class[_$1] where type _$1
 required: Class[A]
  def create[A]()(implicit m: ClassManifest[A]): ClassName[A] = new ClassName(m.erasure)

エラーが発生したメソッドは、ClassManifest[A]を暗黙引数で取得しており、ClassManifest[A]#erasure メソッドを実行し、型パラメータに指定された A の Classオブジェクトを取得しています。
それを、もう一方のメソッドと同様に ClassName[A] のコンストラクタに渡してインスタンスを生成しようと思いましたが、どうやらそれができないようです。

ClassManifest[A] の仕様やソースをしっかり読んだわけではないのですが、想定とは違う動きをしました。
これがなきゃダメ!という訳ではありませんが、気になってしまったので、ソースを読んでこのようになる理由を説明出来ればいいなと思います。

# だれか教えて!!!