<>は場所によって数種類に分類される

  • 型変数の宣言
  • 型変数へのバインド
  • 変数の型の宣言
  • 型変数での変数宣言

型変数の宣言と型変数へのバインドの例

// 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>

References

results matching ""

    No results matching ""