Javaのジェネリクスについて
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
のスーパークラスのみ使用可能となる。