My Photo

« 2012開幕戦予想布陣 #albirex #jubilo | Main | 揺篭のアートマをゲット #FF11 »

February 21, 2012

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

業務でJavaを使っていたときは1.4を使っていたので5.0で追加された以下の機能はよくわからない。

  • ジェネリクス
  • アノテーション
  • 拡張for文
  • ボクシング/アンボクシング
  • enum
  • staticインポート
  • 可変長パラメータ

これらの機能について、昔のJava Pressの記事(Vol.37,38 J2SE 5.0 実践チュートリアル)の記事の内容を自分なりにまとめてみた。
#genericsは「ジェネリクス」と読みたいけど、genericは「ジェネリック」と読みたい。「ジェネリック医薬品」とか言うし。統一感ないな^^;

総称型(generic type)

「総称型=パラメータされた型(parameterized type)」なんだろうか?同じと言っている人もいれば、総称型に型引数を与えたものをがパラメータ化された型だという人もいる。
Oracleのサイトのチュートリアルには

An invocation of a generic type is generally known as a parameterized type. ジェネリック型の呼び出しは、通常、パラメータ化された型として知られています。
とあるから、そういうことなんだろうか。まあ、あまり深く考えないことにしよう^^;

総称型の宣言は、クラス名の後に1個以上の型パラメータ(type parameter)を"<>"で囲んだ型パラメータリストを書く。
型パラメータリストに書いた型変数(type variable)をそのクラス内・インタフェース内で使用できる。
#parameter=引数、パラメータ

class クラス名<型変数[,型変数,...]> { ... }
interface インタフェース名<型変数1[,型変数2,...]> { ... }

型変数は一般的な以下のようにアルファベット1文字の名前が使われる。

名前意味
E Element。コレクションの要素。
K Key。Mapのキー。
V Value。Mapの値。
T,S,U,V Type。一般的な型。
複数ある場合にはTの近傍の文字を使う。

イレイジャ

総称型をコンパイルしてできたバイトコードにはジェネリクスに関する情報は含まれていない。
これはコンパイラが型変数をObject型として適切にキャストを行うバイトコードを生成するため。
このようなコンパイラの処理をイレイジャ(erasure)と呼ぶ。

ジェネリクスの制約

1.型変数に対して基本データ型を指定することはできない。

List<int> list = new ArrayList<int>();  // コンパイルエラー

2.型変数のオブジェクトを直接生成することはできない。

E e = new E();  // コンパイルエラー

3.型変数Eの配列を生成することはできない。

E[] array = new E[10];  // コンパイルエラー

4.メソッドの戻り値として型変数の配列を返すようにしても Object の配列にとなる。

5.型変数はstaticメンバとstatic初期化子には適用できない。

class GlobalStack<E> {
  private static List<E> stack = new ArrayList<E>();  // コンパイルエラー
  
  public void push(E e) { stack.add(e); }
  public E pop() {return stack.remove(0); }
}

6.イレイジャの結果、メソッドのシグネチャが同じになるメソッドは定義できない。

class Foo<T, S> {
  public void method(T t) {};  // コンパイルエラー
  public void method(S s) {};  // コンパイルエラー
}

7.型変数が異なる同じインタフェースを複数実装することはできない。

// コンパイルエラー
class Foo implements Bar<Integer>, Bar<String> { 
}

参考記事:Java Press Vol.37 J2SE 5.0 実践チュートリアル
参考ページ:
Generic Types (The Java™ Tutorials > Learning the Java Language > Generics)
Java総称型メモ(Hishidama's Java Generics Memo)
キュー構造をJavaで実装してジェネリック型を理解する (2/3) - @IT

« 2012開幕戦予想布陣 #albirex #jubilo | Main | 揺篭のアートマをゲット #FF11 »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

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

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

« 2012開幕戦予想布陣 #albirex #jubilo | Main | 揺篭のアートマをゲット #FF11 »

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