2008年2月28日木曜日

Genericsにてnew T()できないのがキモイ

例えば、

<T> T method() {
  T instance = new T();
  return instance;
}
とかしたかったんですよ。でも、「new T()」がコンパイルエラー。 仕方ないから
<T> T method(Class<T> c) {
  T instance = c.newInstance();
  return instance;
}
とするしかない。ちなみに、Class#newInstance();がInstantiationExceptionとかをthrowするからちゃんとcatchしなきゃイカンですよ。Sunのgenerics-tutoral-1.pdfのSectino8にもこれに関する話が少し出てきている。「後方互換のため、実行時に型情報が消え去る」という問題があるかららしぃ。
でも、コンパイル時にnew T() -> T.class.newInstance()に落としてくれたらええがな!気が利かんやっちゃな!とか思ってなかなか納得行かず、もんもんとしてたわけです。だが、落とした場合は
A method() {
 return A.class.newInstance();
}

B method {
  return B.class.newInstance();
}
...
のような形になるはずで、これは古いjdkでは型が違うメソッドって定義できないんでした。すっかり忘れてた。Generic出始めの頃にも確か同じ事を思った記憶が合って、その時も納得行かず、そのままにしてたのを思い出した。 ちなみに、これが「後方互換のため」を意味する事の真意かどぅかはワカランが、納得できたからこれ以上掘り下げる気はナッシンw
コメントくださった、cactusman, Horiuchi_H, shot6、の人たちありがとぅございました。

コメントを投稿