ジェネリクスとは

ジェネリクス(総称型/テンプレート)とは

genericsとは包括的なといった意味になります。ジェネリクスとは一言で言えば、型の包容力です。型を大きく曖昧に受け止める事が出来ます。実はリストやマップなどのコレクションクラスですでこの考え方は使っているはずです。

使い方

<~>記法。よく見るのこのEやTに特段意味はありません、慣習的にそうしてるにすぎないです。このなどを仮型引数と呼びます。を使って定義されたクラスはこの時点ではどのような型になるかは、決めてられていません。つまり型を呼び出し側に委ねています。java5以前はこれをObjectクラスなどで実装していましたが、戻り側でキャストが必要で中の型が一時的に隠蔽される為問題とされていました。

昔のダメなやつ

public class Pocket {
    private Object data;

    public void put(Object d) {
        this.data = d;
    }

    public Object get() {
        // これObject型として返却されるのでキャストが必要に...
        retur this.data;
    }
}

総称型のいいやつ

// 中でT型を定義してしかもそれを返却することで
// 呼び出し側と返却の型の一致を担保する
public class Hoge<T> {
    T o;

    public Hoge(T value_) {
        this.o = value_;
    }

    public T get() {
        return o;
    }
}

上記を使ってみる

Hoge<Integer> b = new Hoge<Interger>(new Interger(111));
Interger i = b.get();
System.out.println(i);

何が便利になったのか?

これにより、例えば今までObjectなどで定義していて取り出すときにキャストするなどの方法が、キャストをする必要もなくなり、IntのbクラスにString を入れてしまうというような誤りをコンパイル時に検出出来ず実行時に出ていたものが、コンパイル時に検出できることになります。まっ要するに、ジェネリクス多様すれば静的型付けのめんどくさーい部分をnewするときにいろいろ変えられるってわけ。

ジェネリクスの注意点

ジェネリックス型を定義する際に、慣例的に用いられている表記法があります。通常の変数と明確に異なることを示すために、大文字の文字一文字を使います。

文字 意味
T
S,U,V 型2,3,4番目

ジェネリクスを理解するのに役立つ考え方

変性とは

変性とはある型がある型に代入できる時のその型同士の受け皿の広さの事。

  • 共変 (covariant): 広い型(例:double)から狭い型(例:float)へ変換すること。
  • 反変 (contravariant) : 狭い型(例:float)から広い型(例:double)へ変換すること。
  • 不変 (invariant): 型を変換できないこと。

ジェネリクスはコンパイル時にエラーを起こしてくれる、つまり不変にしてくれてかつ定義の自由さも担保してくれてる、って事。

参考

コメントを残す