|
J2SE 5.0 codeName Tiger
|
2006/04/04
|
@author k.mori
|
|
Generics ジェネリックス
▼Generics というのは ひとことでいえばクラス (インタフェース)、メソッドのパラメータ化です。
例をあげると、
■今までは
ArrayList arraylist = new ArrayList();
arraylist.add("abc");
String s = (String)arraylist.get(0); // キャストが必要
|
■Generics を使うとつぎのようになります
◎ List
<String>
list
= new ArrayList
<String >
();
list.add("abc");
String str = list.get(0); // キャストが不必要
|
◎印の
<String>
というのが Generics の表記です。
これはどういう意味かというと、
<String>
で修飾された
List オブジェクトは保持する要素
すべて String オブジェクトに
なるということを示しています。このためキャストがいらなくなっています。
(Listをnewする際に、Listに追加できる型を最初に設定している)
▼Iteratorを使用した例
List list = new ArrayList();
for(int i = 0; i < args.length; i++) {
list.add(args[i]); // 型チェックが行われない
}
StringBuffer buffer = new StringBuffer();
Iterator it = list.iterator();
while(it.hasNext()) {
String tmp = (String)it.next(); // キャストが必要
buffer.append(it.next());
}
System.out.println(buffer);
|
※Collection#iterator メソッドは戻り値がパラメータ化された Iterator オブジェクトになります。
■Generics
List
<String>
list = new ArrayList
<String>
();
for(int i = 0; i < args.length; i++) {
list.add(args[i]); // 型チェックが行われる
}
StringBuffer buffer = new StringBuffer();
Iterator
<String>
it = list.iterator();
while(it.hasNext()) {
buffer.append(it.next()); // キャストがいらない
}
System.out.println(buffer);
|
▼入れ子パラメータ 2 重リストの例
public final static String[] cards = {"S", "C", "H", "D"};
public static void main(String[] args) {
List deck = new ArrayList();
for (int i = 0; i < cards.length; i++) {
List row = new ArrayList();
for (int j = 1; j <= 13; j++) {
if (j == 1) {
row.add(cards[i] + "A"); // 型チェックが行われない
} else {
row.add(cards[i] + j); // 型チェックが行われない
}
}
deck.add(row); // 型チェックが行われない
}
String card ="";
for (int i = 0; i < cards.length; i++) {
for (int j = 0; j < 13; j++) {
// とっても面倒なキャスト処理
card = (String)((List)deck.get(i)).get(j);
System.out.println(card);
}
}
}
|
※要素を取り出すのに 2 回もキャストする必要があります。
■Generics
public final static String[] cards = {"S", "C", "H", "D"};
public static void main(String[] args) {
List
<List<String>>
deck
= new ArrayList
<List
<
String>>
();
for (int i = 0; i < cards.length; i++) {
List
<String>
row
= new ArrayList
<String>
();
for (int j = 1; j <= 13; j++) {
if (j == 1) {
row.add(cards[i] + "A"); // 型チェックが行われる
} else {
row.add(cards[i] + j); // ここも型チェック
}
}
deck.add(row); // もちろん、ここでも型チェックが行われる
}
String card ="";
for (int i = 0; i < cards.length; i++) {
for (int j = 0; j < 13; j++) {
card= deck.get(i).get(j); // 簡単
System.out.println(card);
}
}
}
|
|