コレクションとオートボクシング
ところで、このサンプルを見て「なんか変だぞ?」と感じた人はいませんでしたか。「コレクション関係のクラスは、オブジェクトを管理するものだ」と説明したのを覚えていますか? このサンプルを見ると、int値やboolean値もaddされています。これらは基本型であり、オブジェクトではありません。ってことは、オブジェクトでないものも、addして管理できるのでしょうか。
いいえ。コレクションのクラスが管理できるのはオブジェクトのみです。基本型の値は管理できません。では、なぜintやbooleanがaddできたのか。それは、Java 5以降に用意された「オートボクシング」と呼ばれる機能のおかげです。
オートボクシングは、オブジェクトが要求されるところに基本型の値が渡されたとき、自動的にその値のラッパークラスのインスタンスに変換する機能のことです。ラッパークラスというのは、基本型の値をオブジェクトとして扱うときに利用されるクラスです。文字通り「基本型の値をラップしてオブジェクトにする」ものですね。
例えば、int値には、ラッパークラスとして「Integer」というものが用意されています。int値をオブジェクトとして扱いたい場合には、このIntegerクラスのインスタンスとして値を用意するのが基本だったのです。例えば、今の例なら、
Integer obj = new Integer(123);
list.add(obj);
こんな具合に書くのが一般的だったのです。が、Java 5からは、オブジェクトが必要なところに基本型があると、自動的にそのラッパークラスのインスタンスに変換されるようになりました。つまり、list.add(123);とすれば、自動的にlist.add(new Integer(123));と内部的に実行され、何もしなくとも自動的にIntegerインスタンスがaddされるようになっていたのですね。
オートボクシングにより、int値をaddすると自動的にIntegerインスタンスでラップして保管される。 |
総称型とは?
ところで、ここでの例のように、ArrayListの中になんでもかんでも放り込んでおく、といった使い方は、案外と多くはありません。もっとも多いのは、決まったタイプのオブジェクトを多数収めて利用するというものです。
こうした「決まった種類のオブジェクトを入れて管理する」という場合、コレクションには非常に大きな問題が一つあります。それは、「どんなオブジェクトでも入れることができてしまう」という問題です。つまり、そこに入っているのが必要なクラスのインスタンスなのか、それとも全然違うものなのか、取り出してみるまでわからないのです。
が、これは非常に困ります。「決まった種類のオブジェクトだけしか入れられない」ようにする仕掛けがほしいところですね。そこでJava 5より登場したのが「総称(Generic)」と呼ばれるものです。