<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 件のコメント:
コメントを投稿