
Javaは、型を必ず宣言する型が厳格な言語だとよく言われますよね。
そもそも、型の存在異議や、メリットってなんでしょうか。
型のメリット
int型には、int、Stringには文字列というように「格納するデータに制約をかけることができる点」です。
例えば、メソッドの引数が二つあって、どちらもObject型(型を何でも許容する型)になっていたら、それだけでコンパイルは通ってしまい、重大なミスの発見が後回しになってしまいかねません。
ジェネリクス(仮型引数)について
例えば、ArrayListを使う場合は、下記のように(<~>)を用いると思います。これを、「ジェネリクス」(仮型引数)と呼びます。
1 |
ArrayList<String> list = new ArrayList<String>(); |
このジェネリクスは、Javaの文法の一つで、クラスの型がまだ決まっていないが、使う時は型を固定して使いますよということができる方法になります。
例えば、ArrayListのAPIリファレンスを見ると、下記のように「<E>」という表記になっています。
「E」は、実際に「P」でも、「C」でも何でもよいのですが、現時点で型がまだ決まっていませんよという意味になります。
なので、ArrayListには、String型だったり、Integer型だったり、色々な型を代入することができるわけですね。
実際にジェネリクスを用いたクラスを作ってみる。
Javaの文法なので、ジェネリクスを使ったクラスをもちろん自作できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Generics<E> { private E data; public E getData() { return data; } public void setData(E data) { this.data = data; } } |
上記のように、クラスに「<E>」とつけてあげることで、その「E」を一律クラスの中で同じ決まっていない型として扱うことができます。
下記のようにして、型をString決めてあげて、宣言することでString型のクラスとして使うことが出来るようになりましたね。
1 2 3 |
Generics<String> gene = new Generics<String>(); gene.setData("あ"); System.out.println(gene.getData()); |
ジェネリクスのメリット
これも、「型安全」の一種です。上の例で言えば、ArrayListに、String型のみしか代入することをさせなくします。
通常のintや、String等の型と違って、クラス内にまとめて型を宣言することができるのがメリットで、作ったクラスの汎用性も上げつつ、型安全によるメリットも享受できます。
型による安全性と、自由性のいいとこ取りを目指したJavaの文法というわけですね。
この記事へのコメントはありません。