【Java】ジェネリクスとは - 使い方や用途を解説
- 作成日:2022/11/05
Javaにおけるジェネリクスという仕組みについて解説します。
ジェネリクストは
ジェネリクスとはクラスやメソッドを使うときに、型を指定することができる仕組みです。 ジェネリクスを使って定義されたクラスはString型で使ったり、Integer型で使ったりできるので、 1つのクラスを複数の型で使い分けることができます。
ジェネリクスを使うときは、クラス名の横に<T>や<E>などの型パラメータというものをつけて記述します。
class testJene<T>{
testJene(T tmp1){
System.out.println(tmp1);
}
}
2行目で「このクラスはT型というジェネリクスを使います。」ということを明示しています。 TにはStringやIntegerなど好きな型を指定できます。 後述しますが、何の型を使うかはクラスを作成するときに指定できます。
また、4行目のメソッド(コンストラクタ)ではT型の変数を受け取り、それを出力しています。 ここでは2行目で指定したT型と同じ型が入ります。
このように、ジェネリクスは「何の型を使うかはまだわからないけど、統一された1つの型を使ってね」という ことを指定できる仕組みです。次項からは、使い方や用途などを解説していきます。
使い方
ジェネリクスを使ったクラスを生成する場合、型を指定してクラス生成する必要があります。 先ほど紹介したジェネリクスを使ったtestJeneクラスを使うやり方を見てみましょう。
class testJene<T>{
testJene(T tmp1){
System.out.println(tmp1);
}
}
public class TestJava {
public static void main(String[] args) {
//String型で実行
testJene<String> tmp = new testJene<String>("aaa");
//Integer型で実行
testJene<Integer> tmp2 = new testJene<Integer>(123);
}
}
ジェネリクスを使ったクラスを生成する場合は、クラス名の横に型を指定します。 14行目ではString型で、17行目ではInteger型でクラス生成しています。
なお、14行目の右辺の<String>は<>と省略することができます。これをダイヤモンド演算子といいます。 左辺でString型を指定していますが、当然、右辺も同じ型になるため省略が許されるわけですね。
aaa
123
このように、ジェネリクスを使う場合は、クラス内ではT型など型をあやふやにしておき、 クラスを生成するときに初めて型を指定します。 そうすることで、T型のクラスをString型で使ったり、Integer型で使ったりできるわけです。
こう解説すると、なぜ型を使い分ける必要があるの?という疑問がでてくると思うので、次項で解説します。
用途
ジェネリクスを用いて型を使い分ける意味ですが、Listを例にするとわかりやすいです。 Listは配列と似ていますが、要素を動的に操作できるのが特徴です。
例えば、以下のような簡単なListがあるとします。
import java.util.ArrayList;
import java.util.List;
public class TestJava {
public static void main(String[] args) {
//リストの作成
List<Integer> list = new ArrayList<>();
//データ追加
list.add(100);
list.add(200);
list.add(300);
//出力
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
}
}
11行目でリストを作り、その後Addメソッドでデータを3つ追加し、それらを出力する処理です。 Listを作る時、ジェネリクスで型を指定しています。今回はInteger型でListを使っていますね。
さて、ここでジェネリクスを使わない場合はどうでしょう。 Integer型以外にもString型など他の型のデータを追加できてしまいます。
配列やListでデータを管理する場合、型を統一するのが普通です。 年齢を管理したい場合は数値、名前を管理したい場合は文字列といった具合です。 年齢配列の中に1つだけ文字列が入っていたらエラーやバグの原因ですよね。
そこで便利なのがジェネリクスです。ジェネリクスで型を指定しておけば、 その型以外のデータを追加しようとすると構文エラーとなるので追加できません。 ジェネリクスで型を指定するということは「その型以外のデータは使わないでね」という意味でもあるのです。