new T() とか T.newInstance() とか って できない件
できないけど、回避方法があるんです。
なんと、コンストラクタで相称型TのObjectが受け取れます。
class Hoge<E> { Class<E> type; @SuppressWarnings("unchecked") public Hoge(E... e){ this.type = (Class<E>) e.getClass().getComponentType(); } public void execute() throws InstantiationException, IllegalAccessException{ type.newInstance(); } }
そもそも、折角 抽象クラスにしてるのに、new して具象化しちゃったら意味なくね?
って話なんですけど、簡単なORMapper(Bean生成してSetterに値を詰めるところ) を自作してたら、この問題に直面しました。
最近、ようやっとGenericsを使ったクラスが少し書けるようになってきて、調子に乗ってたら痛い目見たわ。
詳しくはこちらのブログに書かれてます。この人スゲー
http://d.hatena.ne.jp/language_and_engineering/20120502/p1
ちなみに method の場合も引数で取れます。
... て思ったけど、コンパイラによって挙動が違いました。バグ?
public static void main(String[] args) throws InstantiationException, IllegalAccessException { List<Integer> list = foo("test"); } @SuppressWarnings("unchecked") public static <E> List<E> foo(String s, E... e) { System.out.println(e.getClass().getComponentType()); // class java.lang.Integer が出力される return new ArrayList<E>(); }