libro
www.tuyano.com
初心者のためのJava SEプログラミング入門

コレクション・フレームワーク (5/5)

作成:2012-05-06 10:33
更新:2012-05-06 10:33

■総称型(Generic)について

実際にコレクション関係のクラスを利用してみると、コンパイルする途中で警告が表示さて驚いた人もいるんじゃないでしょうか。これは、「コレクション関係のインスタンスにどんな値が入れられるかチェックできないから危ないぞ」という意味の警告なのです。

コレクション関係のクラスは、オブジェクトであればどんなものでも入れられます。いえ、オブジェクトでなくても、入れられます。HashMapのサンプルで、map.put("国語", 98);というように整数の値を保管したでしょう? 98というのは、int値であってオブジェクトではありません。でも、ちゃんと値は保管できましたね? これは「オートボクシング(auto boxing)」という機能のおかげです。

オートボクシングというのは、基本型の値を自動的にオブジェクトにラップする機能です。例えば、int型の値をオブジェクトとして利用する必要があるとき、自動的にIntegerインスタンスに変換してくれます。この逆に、Integerインスタンスを自動的にint値に戻す機能を「アンボクシング(unboxing)」といいます。この機能により、「オブジェクトしか保管できない」というコレクションに、普通の値も保管できるようになっているのですね。

で、話を戻しましょう。どんなオブジェクトでも保管できるということは、逆にいえば「どんなオブジェクトが入っているかわからない」ということでもあります。例えば、ここではテキストや整数の値を保管するサンプルを作りましたが、そのコレクションに、必ずテキストや整数が保管されているかどうかは、わかりません。

特にプログラムが複雑になってきたりすると、自分では気が付かないけどぜんぜん違うクラスのインスタンスを入れちゃってた、なんてこともあるかも知れません。あるいは、大規模開発で大勢のプログラマが分担して作業していたりすると、そういうトラブルを起こす可能性も高まります。

そこで、コレクション関係のオブジェクトに「これは、○○のインスタンスしか入れられません!」ということを設定する機能が用意されました。これが「総称型(Generic)」というものです。この総称型は、変数の宣言やインスタンス作成などの際、変数名の後に<>記号を使って、保管できるクラス名を指定します。例えば、「Stringしか入れられないArrayList」であれば、こんな具合に作成をします。
ArrayList<String> 変数 = new ArrayList<String>();
HashSetでも、同じように使うことができます。HashMapの場合には、キーと値の両方に使用する型を設定することができます。例えば、こんな具合です。
HashMap<String,Integer> 変数 = new HashMap<String,Integer>();
こうすると、「キーはString、値はInteger」の値しか保管することができなくなります。実に便利ですね。――では、簡単な利用例を下に挙げておきましょう。先にArrayListで作成したサンプルを、総称型で「テキストしか保管できない」ように修正したものです。

ここでも、forで繰り返し値を取り出していますが、とり出すところがちょっと違っていますね。先のサンプルと、ここでの処理を比較してみましょう。
先の例: Object obj = list.get(i);
今回の: String s = list.get(i);
コレクション関係のクラスでは、追加した値は一度Objectインスタンスにキャストされて保管されました。ですから、値をとり出すときは、まずObjectとして取り出したものをもとのクラスにキャストして戻さないといけなかったのです。

ところが、総称型を使うと、Objectではなく、直接Stringとしてとり出すことができます。総称型では、保管可能な値の型はあらかじめ決められていますから、その種類のものしか保管できません。ですから、Objectにキャストして保管する必要がないのです。

この総称型は、コレクションを利用するときの基本として頭に入れておきましょう。保管する値の内容が決まっているような場合は、常に総称型を使って記述すべきだ、と考えましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

import java.util.ArrayList;

public class TestApp {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("bye");
		list.add(1, "-insert it!-");
		for(int i = 0;i < list.size();i++){
			String s = list.get(i);
			System.out.println("No," + i + ": " + s);
		}
	}

}
※関連コンテンツ

「初心者のためのJava SEプログラミング入門」に戻る