ココでわかるAndroidアプリ開発

あなたのプログラミングを徹底サポート

【Java】ジェネリクスとは - 使い方や用途を解説

  • 作成日:2022/11/05

Javaにおけるジェネリクスという仕組みについて解説します。

ジェネリクストは

ジェネリクスとはクラスやメソッドを使うときに、型を指定することができる仕組みです。 ジェネリクスを使って定義されたクラスはString型で使ったり、Integer型で使ったりできるので、 1つのクラスを複数の型で使い分けることができます。

ジェネリクスを使うときは、クラス名の横に<T>や<E>などの型パラメータというものをつけて記述します。

App.java

class testJene<T>{
    
   testJene(T tmp1){

        System.out.println(tmp1);   
    }
}

2行目で「このクラスはT型というジェネリクスを使います。」ということを明示しています。 TにはStringやIntegerなど好きな型を指定できます。 後述しますが、何の型を使うかはクラスを作成するときに指定できます。

また、4行目のメソッド(コンストラクタ)ではT型の変数を受け取り、それを出力しています。 ここでは2行目で指定したT型と同じ型が入ります。

このように、ジェネリクスは「何の型を使うかはまだわからないけど、統一された1つの型を使ってね」という ことを指定できる仕組みです。次項からは、使い方や用途などを解説していきます。

使い方

ジェネリクスを使ったクラスを生成する場合、型を指定してクラス生成する必要があります。 先ほど紹介したジェネリクスを使ったtestJeneクラスを使うやり方を見てみましょう。

App.java

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があるとします。

App.java


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つだけ文字列が入っていたらエラーやバグの原因ですよね。

そこで便利なのがジェネリクスです。ジェネリクスで型を指定しておけば、 その型以外のデータを追加しようとすると構文エラーとなるので追加できません。 ジェネリクスで型を指定するということは「その型以外のデータは使わないでね」という意味でもあるのです。

この記事のシェアはこちらから

カテゴリー

カテゴリーの一覧です。

Contact

当サイトへのご連絡は以下よりお願いします。

© Copyright 2022 ココでわかるAndroidアプリ開発