支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • Javaにおけるジェネリクスとは?サ

はじめに

オブジェクト指向を用いるプログラミング言語として有名なJavaですが、Javaにはプログラミングを簡易化するために多くの仕組みが用いられています。この記事ではJavaの中の1つの技法であるジェネリクスについて記載していきたいと思います。

Javaのジェネリクスとは?

Javaにおけるジェネリクスは別名総称型とも呼ばれる型で、クラスやメソッドに<>表記を加えることで、<>内の型で引数を受け取り、クラスやメソッドを利用できる仕組みを指します。どういうことかを文面だけでは掴みにくいと思うので、サンプルコードを例に示していこうかと思います。

class Sample{
private Object obj;
public void set(Object obj) {
this.obj = obj;
}

public Object get() {
return this.obj;
}}


class Main{
public static void main(String args[]) {
Sample sa = new Sample();
sa.set("サンプル");
String s = (String)sa.get();
System.out.println("「"+s+"」という文字を受け取りました。");
}}

実行結果:「サンプル」という文字を受け取りました。

このサンプルコードは、Javaの ジェネリクスを用いない方法でのプログラムになります。まず、SampleクラスとMainクラスに分け、Sampleクラスにはメソッドを格納しています。まず。MainメソッドでSampleクラスをインスタンス化した後、Sampleクラスのsetメソッドを呼び出しています。ここで、setメソッドはどのような型でも引数を受け取れるようにObjectクラスを引数にしています。MainメソッドではString型を引数の型を渡していますが、ObjectクラスはStringクラスの親クラスとなるので、引数として受け取ることができます。その後getメソッドでobjの値を取り出しています。ここで注目なのが、objはObject型なので、String型にキャストしないといけない点です。ジェネリクスの技法は、このようなキャスト忘れによるコンパイルエラーを防ぐように設計されています。以下のコードは、上記のサンプルコードにジェネリクスを用いたコードになります。

class Sample<T>{
private T t;
public void set(T t) {
this.t = t;
}

public T get() {
return this.t;
}}


class Main{
public static void main(String args[]) {
Sample<String> sa = new Sample<String>();
sa.set("サンプル");
String s = sa.get();
System.out.println("「"+s+"」という文字を受け取りました。");
}}

実行結果:「サンプル」という文字を受け取りました。

こちらがJavaのジェネリクスを用いたコードになります。まず、class Sampleの横に<T>という仮型引数を設定します。ちなみに、TではなくEでもAでも設定は可能になります。この時点では、Tはどの型になるかは決まっていません。フィールドもT型に、setメソッドの引数もT型を引数として受け取るように変更しています。getメソッドの戻り値もT型指定です。次にMainメソッドを見てみましょう。Sampleクラスのインスタンス化をする際、<String>を指定しています。これにより、T型をString型と判断して利用することができます。その後の流れは同じですが、getメソッドの戻り値はString型となっているため、キャストを行なわず値を代入することが出来ています。<>の中の型を変えることによってTの型は変わるので、例えばIntegerを指定すればTは Integer型として認識されます。同じメソッドを型を変えて使用したい場合等には非常に便利で、柔軟性のあるプログラムに仕上げることが可能です。

ジェネリクスに関しては、今回のように自分で仮型引数のあるクラスを作成して利用する方法もありますが、Javaライブラリにあるクラスの中でジェネリクスの技法を使っているクラスも多数存在します。ArrayListクラスが1つの例で、ArrayListクラスをインスタンス化して利用する際は型を指定します。リストの中にどの型を入れるかはインスタンス化するまでわからないようにしておかないと柔軟性を維持できません。ArrayList以外にもHashMap<T,E>型など、複数の型を指定して利用する場合もあります。

まとめ

この記事ではJavaにおける技法の1つであるジェネリクスについて記載してきました。Javaを使ってプログラミングを行う際、プログラミングの簡略化や柔軟性の追加等を行なってシステムを幅を効かせることが非常に重要であり、質の高いシステムを開発する際には欠かせない考え方になります。今回紹介したのはジェネリクスの基本部分と考え方になりますが、是非習得して開発に反映させていただければと思います。ご拝読いただきありがとうございました。