ジェネリクスの手習い

来るべきJava5時代(っていつだよ?)に備え,Genericsと戯れる。
ジェネリクス・クラスは割とすぐ理解できたので,止めときゃいいのにジェネリクス・メソッドに手を出してみた。


試しに組んでみたコードはこんなの。

public class Test {
  public static <T> List<T> createList(Class<T> clazz) throws Exception {
    T o = clazz.newInstance();
    List<T> list = new ArrayList<T>();
    list.add(o);
    return list;
  }
}

やってみたかったことは,「引数で指定された型を持つListを返してもらう」こと。メソッドの中身は便宜上なので,あまりツッコまないこと。:-D
使い方は,こんな感じになる。

  List<String> list = Test.createList(String.class);

型変数をクラスにではなく,意図的にメソッドで宣言してみたんだけど,この場合,型変数:Tのスコープはこのメソッド限定になるんだろうなぁ,と。


たとえばだ。ジェネリクス・クラス使って,こんなコード書いたとする。
#細かいところは気にするな。

public class Test<T> {
  private List<T> list;

  public Test(List<T> _list) {
    list = _list;
  }
  public T first() {
    return list.get(0);
  }
}

使い方はこうだよね。

List<String> list = new ArrayList<String>();
list.add("あいうえお");

Test<String> test = new Test<String>(list);
String str = test.first();

これをこうしたいんだけど,そんなのムリな相談なんじゃないかと,気づきつつある。:-D

List<String> list = new ArrayList<String>();
list.add("あいうえお");

// Testもジェネリクスにするのがイヤだ。
Test test = new Test(list);
String str = test.first();

うーん,ジェネリクスをモノにするには,かな〜り素振りをしとかないとイカンのう。:-(


ps.
本日お世話になった書籍。
Java 5.0 Tiger (開発者ノートシリーズ) Java言語仕様 第3版 (The Java Series)