Generics (総称)
(JDK5以降)
- クラスの定義,利用において,型(狭い意味ではクラス)に関する
パラメータ化を実現した.
-
例えば,Stringの木構造,Playerの木構造,Cardの木構造等,
構造的な特徴および構造に起因する操作(例えばルートノードを得る等)
は共通の定義を利用し,
型のみ異なる木構造等を扱うことができる.
-
従来は,全てのクラスがオブジェクトクラスのサブクラスであることを利用して,
オブジェクト(クラス)として扱っていたが,
この場合,もともとの型の(詳細な)情報(例えば本来はPlayerだとか)
を失ってしまうため,あまりよろしくなかった.
従来の(よろしくない)例:
[JAVA]
トランプの手札を加える(addCard)場合,型の情報が喪失するため,
取り出す場合(pickCard)にキャストする必要がある.
-
後述のコレクション(ものの集まりのクラス)の場合,
特にGenericsの効用が大きく発揮される.
-
詳細は解説を参照
[HTML]
-
一般的な記述例
[JAVA]
コレクション
(JDK5以降)
概念と解説
-
集合やリスト等の「物の集まり」を扱うための仕組み.
-
解説: Collection, Iterator
[PPT],
[PDF]
-
ものの集まりとはどうような能力を有するべきかを
インタフェース Collectionで規定している:
解説
[HTML]
関連API
[HTML]
-
Collectionを列挙するための(補助)インタフェース Iterator(イテレーター 反復子)
[HTML]
⇒ 大抵の場合,後述の拡張forループのほうが便利.
代表的なコレクションを実装したクラスと利用例
コレクション利用のポイント
- 扱う型を明示
(例:
Collection <Student> col=new ArrayList<Student>(); )
- 拡張forループの利用
(例:
for(Student s: col){ なにかする } )
昨今,Vectorはあまり使われないようですので,
使わないでください
拡張forループ
(JDK5以降)
- 解説
[HTML]
- すでに上記にも例題が出ているが,
perlのforeachみたいに,Collectionの要素を列挙することができる.
- カウンターやIteratorを使った列挙より,数段シンプル:
比較例
[JAVA]
-
列挙型
[HTML]
とも相性がいい:
例
[JAVA]
オートボクシング (Boxing)
(JDK5以降)
-
解説
[HTML]
- プリミティブ型(int等)と,対応するラッパークラス(Integer等)
の読み替えを自動的にやってくれる機能.
-
前述のCollectionはプリミティブ型を要素として持てないので,
従来はラッパークラスのそのたびに作っていたが,その手間がなくなった.
-
例題
[JAVA]
配列とコレクションの利点・欠点
配列の利点・欠点
- あとから要素数を増やすのが難点.
- 包含関係のチェックや要素があるかどうかのチェック等,
「ものの集まり」としての処理がプア(自分でプログラムしないといけない).
コレクションの利点・欠点
- あとから要素数を増やすのが楽.
-
「ものの集まり」としての処理がリッチ
(多くの処理が実装済,例えば containsやremove等).
共通点
- 型情報(オブジェクトのクラス)を保持できる(ようになった since JDK5).
-
互いに無関係な型を持つオブジェクトを混ぜて保持できない,
というか,混ぜて保持するためには,
共通のスーパークラス(最悪の場合,Object型)
として保持しなければならない.
上記をかんがみて使い分けましょう.