<>は場所によって数種類に分類される
- 型変数の宣言
- 型変数へのバインド
- 変数の型の宣言
- 型変数での変数宣言
型変数の宣言と型変数へのバインドの例
// Tは「仮型引数」
public class Hoge<T> {}
new するときに「型変数へのバインドする」
// Stringは「実型引数」
new Hoge<String>();
変数の型の宣言
上で「型変数へのバインド」したもとを受け取る変数で使う
//
Hoge<String> hoge = new Hoge<String>();
// ワイルドカードを使う場合には
Hoge<?> hoge = new Hoge<String>();
ワイルドカード ?
- superとextendsで境界を設定
- &による複数のinterfaceの継承は表現できない
以下のようなclass構造があったとして
public class A {}
public class B extends A {}
public class C extends B {}
以下のような結果になる
Hoge<A> a = new Hoge<B>(); // コンパイルエラー!
Hoge<? extends A> a = new Hoge<B>(); // このように書く
<? extends B>
と <? super B>
- カバーする方向が反対
- 上記の例からみると
<? extends B>
- B, CがOK
<? super B>
- Bとその親であるAがOK
複数interfaceを持つclassを指定
<T extends ClassA & InterfaceB>