ジェネリクスメモ

      2018/05/23

Javaジェネリクスでスーパークラスなどを指定して使用できる型を制限する場合のメモです。

基本動作

ジェネリクスは変性非変なので、スーパークラスへの代入ができない。(下記のコードがエラーとなる)

private class TestGen<T> {
}

TestGen genint = new TestGen<>();
TestGen genobj = genint; // NG

境界型パラメータ

<T extends E>

Eを継承したクラスのみ使用可能となる。 但し変性非変のままなので、継承元への代入はできない。

private class TestGen<T extends Number> {
}

TestGen<Integer> genint = new TestGen<>();
TestGen<Number> genobj = genint; // NG

境界ワイルドカード型

ワイルドカード型で型定義すると、スーパークラスへ代入可能となる。

private class TestGen<T extends Number> {
}

TestGen<? extends Number> genint = new TestGen<Integer>();
TestGen<? extends Number> genobj = genint; // OK

上限境界ワイルドカード型

List<? extends T>

Tのサブクラスのみ使用可能となる。

下限境界ワイルドカード型

List<? super T>

Tのスーパークラスのみ使用可能となる。

 - Java