Java/Tiger/Generics
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
***Genericsって [#b7f430d9]
Genericsとは、C++のテンプレートのような機能で、クラスやイ...
-よけいな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...
インタフェース List<E>
と宣言されています。
***Iteratorと使う [#ve9231f1]
先はListの例でしたが、次はIteratorです。Listの返り値はパ...
public class GenericsSample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();//Inte...
for (int i = 0; i < 10; i++) {
list.add(new Integer(i));
}
Iterator<Integer> e = list.iterator();//この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...
Iterator<String> e = keys.iterator(); //そのSetのItera...
while (e.hasNext()) {
String key = e.next(); //だからキャストがいらない
Integer integer = map.get(key); //ここもキャストがい...
System.out.println(key + ":" + integer);
}
}
**自分で作ってみる [#z56d2b36]
Genericsの使い方は何となく分かってきたので、次はGenerics...
E get(int index);
などは、Eはインタフェースは共通ではないけど(共通があると...
他には、あるサービスを取得するメソッドを作ろうと思ったと...
<T> T getService(Class type);
みたいにクラスを渡してサービスを取得するメソッドをパラメ...
**クラスのパラメータ化 [#m8abe496]
Genericsなクラスを作るには
public interface GenericDao<T, PK extends Serializable> {
PK create(T newInstance);
T read(PK id);
void update(T transientObject);
void delete(T persistentObject);
}
などとクラスの定義でGenericDao<T> などと書けばOKです。
上の例の
PK extends Serializable
の部分は引数はSerializableなら何でもいいって事になります。
***パラメタはサブクラスでもいい [#d49c110f]
public class Hoge<T> {
private T t;
public Hoge(T t) {
this.t = t;
}
public void exe(List<T> list) {}
}
のばあい、コンストラクタの引数がTなので、TをListとすると
List list=new ArrayList();
Hoge<List> hoge=new Hoge<List>(list);
ってなります。listはListのサブクラスでもOKです。しかし
public void exe(List<T> list) {}
に関してはたとえばTをNumberだとすると
List<Integer> list = new ArrayList<Integer>();
hoge.exe(list);
はコンパイルエラーとなります。listはList<Integer>なのでLi...
Tのサブクラス、この例だとNumberのサブクラスならいいよって...
前: public void exe(List<T> list) {}
後: public void exe(List<? extends T> list) {}
とします。?のワイルドカードを使って、Listの型はTのサブク...
public void exe(List<? super T> list) {}
public void exe(List<?> list) {}
ってかきます。
なんだかわけがわからなくなってきました。
**メソッドのパラメータ化 [#c366f58c]
クラスのパラメータ化ではなくて、メソッドだけのパラメータ...
public class ServiceFactory {
private Map map = new HashMap();
public <T> T createService(Class<T> type) {
return (T) map.get(type);
}
}
と戻り値の前にGenericsの型を書いておくことで
ServiceFactory factory = new ServiceFactory();
List list = factory.createService(List.class);
そのメソッドだけをパラメータ化することができます。つまりL...
----
この記事は
#vote(おもしろかった[18],そうでもない[4])
- Genericsについて、クラスのパラメタ化はクラスの定義で<T>...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
終了行:
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
***Genericsって [#b7f430d9]
Genericsとは、C++のテンプレートのような機能で、クラスやイ...
-よけいな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...
インタフェース List<E>
と宣言されています。
***Iteratorと使う [#ve9231f1]
先はListの例でしたが、次はIteratorです。Listの返り値はパ...
public class GenericsSample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();//Inte...
for (int i = 0; i < 10; i++) {
list.add(new Integer(i));
}
Iterator<Integer> e = list.iterator();//この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...
Iterator<String> e = keys.iterator(); //そのSetのItera...
while (e.hasNext()) {
String key = e.next(); //だからキャストがいらない
Integer integer = map.get(key); //ここもキャストがい...
System.out.println(key + ":" + integer);
}
}
**自分で作ってみる [#z56d2b36]
Genericsの使い方は何となく分かってきたので、次はGenerics...
E get(int index);
などは、Eはインタフェースは共通ではないけど(共通があると...
他には、あるサービスを取得するメソッドを作ろうと思ったと...
<T> T getService(Class type);
みたいにクラスを渡してサービスを取得するメソッドをパラメ...
**クラスのパラメータ化 [#m8abe496]
Genericsなクラスを作るには
public interface GenericDao<T, PK extends Serializable> {
PK create(T newInstance);
T read(PK id);
void update(T transientObject);
void delete(T persistentObject);
}
などとクラスの定義でGenericDao<T> などと書けばOKです。
上の例の
PK extends Serializable
の部分は引数はSerializableなら何でもいいって事になります。
***パラメタはサブクラスでもいい [#d49c110f]
public class Hoge<T> {
private T t;
public Hoge(T t) {
this.t = t;
}
public void exe(List<T> list) {}
}
のばあい、コンストラクタの引数がTなので、TをListとすると
List list=new ArrayList();
Hoge<List> hoge=new Hoge<List>(list);
ってなります。listはListのサブクラスでもOKです。しかし
public void exe(List<T> list) {}
に関してはたとえばTをNumberだとすると
List<Integer> list = new ArrayList<Integer>();
hoge.exe(list);
はコンパイルエラーとなります。listはList<Integer>なのでLi...
Tのサブクラス、この例だとNumberのサブクラスならいいよって...
前: public void exe(List<T> list) {}
後: public void exe(List<? extends T> list) {}
とします。?のワイルドカードを使って、Listの型はTのサブク...
public void exe(List<? super T> list) {}
public void exe(List<?> list) {}
ってかきます。
なんだかわけがわからなくなってきました。
**メソッドのパラメータ化 [#c366f58c]
クラスのパラメータ化ではなくて、メソッドだけのパラメータ...
public class ServiceFactory {
private Map map = new HashMap();
public <T> T createService(Class<T> type) {
return (T) map.get(type);
}
}
と戻り値の前にGenericsの型を書いておくことで
ServiceFactory factory = new ServiceFactory();
List list = factory.createService(List.class);
そのメソッドだけをパラメータ化することができます。つまりL...
----
この記事は
#vote(おもしろかった[18],そうでもない[4])
- Genericsについて、クラスのパラメタ化はクラスの定義で<T>...
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}
ページ名: