My Photo

« 揺篭のアートマをゲット #FF11 | Main | タスクが実行時のエラー »

February 23, 2012

ジェネリクス(Generics)その2

総称メソッド(generic method)

メソッドだけにジェネリクスを適用する場合、戻り値の前に型変数を書く。
型変数のスコープはそのメソッド内になる。
下記のコードでは swap() が総称メソッドになる。クラスで宣言した型変数Tのスコープはクラス内、総称メソッド swap() で宣言した型変数Uのスコープはメソッド内である。

public class Foo<T> {
  private T t;

  public T getT() { return t; }

  public void setT(T t) { this.t = t; }

  public static <U> void swap(U[] a, int i, int j) {
    U temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }

  public static void main(String args[]) {
    String[] strArray = new String[] { "a", "b", "c", "d", "e" };

    Foo.<String>swap(strArray, 1, 3);  // 完全な文法による呼び出し

    Foo.swap(strArray, 0, 2);  // 型推論により省略した呼び出し

    for (String str : strArray) {
      System.out.println(str);
    }
  }
}

総称メソッドの呼び出しは17行目のようにメソッドの前に型を書くのが完全な文法の書き方だが、19行目のように省略することができる。これは型推論という機能によるものである。

有界の型パラメータ(bounded type parameter)

型パラメータを特定のクラスを継承している、あるいは特定のインタフェースを実装しているものに制限することができる。以下のように記述する。
#bounded=有界の:数学の用語らしい。

<T extends Foo & Bar & Baz>

extendsの後にクラスは最大1個で、必ず最初でなければならない。インタフェースは&を使って複数書くことができる。
上の例では、Fooがクラスならば型パラメータTはFooを継承し、BarとBazを実装するように制限される。またFooがインタフェースならば型パラメータTはFoo、Bar、Bazを実装するように制限される。すべてインタフェースの場合でも implements ではなく extends を使用する。

extendsを使わずに "<T>" と宣言された型パラメータは、"<T extends Object>" と同じである。
"<T>" と宣言された場合、型変数TはバイトコードではObject型たが、 "<T extends Foo>" という宣言ならば型変数TはFoo型となる。

参考記事:Java Press Vol.37 J2SE 5.0 実践チュートリアル

« 揺篭のアートマをゲット #FF11 | Main | タスクが実行時のエラー »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/54054404

Listed below are links to weblogs that reference ジェネリクス(Generics)その2:

« 揺篭のアートマをゲット #FF11 | Main | タスクが実行時のエラー »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof