ジェネリクス(Generics)の基礎を解説!(クラス編)

java

java5.0から登場したジェネリクス(Generics)ですが、メリットとして「キャストが省略できる」こと、「誤った型を指定するとビルドエラーになる」の2つがあげられます。
裏を返していえば、java5.0以降を使ってプログラミングするときに、キャスト(Object型)を多様するとイケていないプログラムになります

[スポンサーリンク]

目次

  1. ジェネリクス(Generics)なクラス
  2. extendsを使ったジェネリクス(Generics)なクラス

ジェネリクス(Generics)なクラス

public class ClassOfGenerics {

    /**
     * ジェネリクスなクラスを定義します。
     * @param <T>
     */
    private static class Example<T> {
        private T param;

        public T getParam() {
            return param;
        }

        public void setParam(T param) {
            this.param = param;
        }
    }

    /**
     * メイン処理です。
     */
    public static void main(String arg[]) {
        // ジェネリクスにStringを指定します。
        Example<String> strExample = new Example<String>();
        strExample.setParam("test!");
        System.out.println("ジェネリクスな型にStringを指定した結果:"
                + strExample.getParam());

        // ジェネリクスにIntegerを指定します。
        Example<Integer> intExample = new Example<Integer>();
        intExample.setParam(1);
        System.out.println("ジェネリクスな型にIntegerを指定した結果:"
                + intExample.getParam());
    }

}

実行結果

>実行結果
ジェネリックな型にStringを指定した結果:test!
ジェネリックな型にIntegerを指定した結果:1

extendsを使ったジェネリクス(Generics)なクラス

public class ClassOfGenericsExtends {

    /**
     * ジェネリックなクラスを定義します。
     * 継承クラスはBaseクラスを指定します。
     * @param <T>
     */
    private static class Example<T extends Base> {
        private T param;

        public T getParam() {
            return param;
        }

        public void setParam(T param) {
            this.param = param;
        }
    }

    /**
     * ジェネリクスで指定されるextendsクラスです。
     */
    private static abstract class Base {
        public String baseParam;
    }

    /**
     * Baseを継承したクラスです。
     * その1
     */
    private static class Abase extends Base {
    }

    /**
     * Baseを継承したクラスです。
     * その2
     */
    private static class Bbase extends Base {
    }

    /**
     * メイン処理です。
     */
    public static void main(String arg[]) {
        // Abaseを生成します。
        Abase aClass = new Abase();
        aClass.baseParam = "これはAbaseクラスです。";

        // ジェネリクスにAbaseを指定します。
        Example<Abase> aExample = new Example<Abase>();
        aExample.setParam(aClass);
        System.out.println(aExample.getParam().baseParam);


        // Bbaseを生成します。
        Bbase bClass = new Bbase();
        bClass.baseParam = "これはBbaseクラスです。";

        // ジェネリクスにBbaseを指定します。
        Example<Bbase> bExample = new Example<Bbase>();
        bExample.setParam(bClass);
        System.out.println(bExample.getParam().baseParam);
    }
}

実行結果

>実行結果
これはAbaseクラスです。
これはBbaseクラスです。