ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

TigerのGenericsで実験中



TigerGenericsでどんなことができるかいろいろ試してみたのですが
パラメタライズされたクラスやメソッドのところで良くわからない動き
がありました。下記のクラスは内部にArrayListを持ったクラスで、リ
ストの中身のクラスをパラメータで指定できるようになっています。


この時にリストの連結をするメソッドを普通に書くとaddListWithParam()
のようになると思うのですが、ArrayListクラスの元のメソッドを使ったり
あるいはそれをパラメタライズしたり、ループで一つずつ追加したりといろ
いろやってみたのですが、いずれもうまくいってくれませんでした。なぜか
メソッドのパラメータ指定を取り除いたaddListWithNoParam()だとうまく
いっているみたいです。パラメータが引数に含まれる場合にはメソッドには
パラメータ指定をつけないといけないと思っていたのですが、もしかして勘
違いしてしまっているのかも知れません。とりあえず、もうちょっと試して
みたいと思います。


addListWithParam()みたいなことを実現するためのスマートな
記法をご存知の方がいらっしゃいましたら是非ご教授ください。

                                                              • -


package sample;

import java.util.*;

public class ListHolder{

     //内部保持するGenericリスト
private ArrayList mItems;

//コンストラク
public ListHolder(ArrayList lstItems){
mItems = lstItems;
}

//要素の追加
public void addItem(T objItem){
mItems.add(objItem);
}

//リストの取得
public ArrayList getList(){
return mItems;
}

//リストの追加(パラメータを明示的に指定)
public void addListWithParam(ArrayList lstItems){

/* ArrayListクラスのメソッドを使う→コンパイルエラー */
//mItems.add(lstItems);
//(パラメタライズを試みるもうまくいかず....)

/* Collectionにキャストする →コンパイルエラー */
//mItems.addAll((Collection)lstItems);
          //(-Xlint=uncheckedをつけても警告が出るし、これは良くない方法)

/* 拡張ループを使って個別に要素を追加 → コンパイルエラー */
//for(T objData : lstItems){
// mItems.add(objData);
//}

}

//リストの追加(パラメータの指定なし)
public void addListWithNoParam(ArrayList lstItems){

//メソッドのパラメータ指定を取るとなぜか動作する
for(T objData : lstItems){
mItems.add(objData);
}
}

public static void main(String[] args){


ListHolder holder =
new ListHolder(new ArrayList());

holder.addItem("あああ");
holder.addItem("いいい");
holder.addItem("ううう");

ArrayList list = new ArrayList();
list.add("かかか");
list.add("ききき");
list.add("くくく");

//holder.addListWithNoParam(list);
holder.addListWithParam(list);

Iterator iterator = holder.getList().iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}