- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
***Genericsって [#b7f430d9]
Genericsとは、C++のテンプレートのような機能で、クラスやインタフェースをパラメータ化するための技術だそうです。Genericsを使うことによって、
-よけいなCastをなくして、コンパイル時に型チェックをできるようになる
-いちいちキャストするコーディングをする必要がなくなる
などいろいろな効果があるようです。
たとえば
List list = new ArrayList();
list.add(new Integer(10));
String str = (String) list.get(0);
などのエラーは実行時しか検知できませんか、Genericsを使って記述すると
List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(10));
String str = (String) list.get(0); <-コンパイルエラーとなる
となりコンパイルエラーとなります。コンパイル時にエラーとなるので、保守性が向上するわけですね。
さて構文ですが、
List<Integer> list = new ArrayList<Integer>();
などとクラス名<クラス名>という構文になります。http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/List.html を見てもわかるとおりJavaDocも
インタフェース List<E>
と宣言されています。
***Iteratorと使う [#ve9231f1]
先はListの例でしたが、次はIteratorです。Listの返り値はパラメタ化Iteratorなので e.next() したときにIntegerにキャストがいらなくなります。
public class GenericsSample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();//IntegerでListを作成
for (int i = 0; i < 10; i++) {
list.add(new Integer(i));
}
Iterator<Integer> e = list.iterator();//このIteratorはIntegerのIterator
while (e.hasNext()) {
Integer integer = e.next(); //Integerにキャストがいらない
System.out.println(integer);
}
}
}
***Mapと使う [#df2a00c8]
次はMapです。key,valueがあるので
Map<String, Integer> map = new HashMap<String, Integer>();
という指定になります。
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0; i < 10; i++) {
map.put("key_" + Integer.toString(i), new Integer(i));
}
Set<String> keys = map.keySet(); //返り値のSetはStringのSet
Iterator<String> e = keys.iterator(); //そのSetのIteratorはStringのIterator
while (e.hasNext()) {
String key = e.next(); //だからキャストがいらない
Integer integer = map.get(key); //ここもキャストがいらない。
System.out.println(key + ":" + integer);
}
}
----
この記事は
#vote(おもしろかった[0],そうでもない[1])
- Genericsについて、クラスのパラメタ化はクラスの定義で<T>とか書く。メソッドだけのパラメタ化ってのもある。 -- [[きの]] &new{2007-06-22 (金) 15:46:20};
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}