アウトプットができる技術者に

it's a time to take a new step !

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>();
}