<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、の人たちありがとぅございました。
0 件のコメント:
コメントを投稿