Javaプログラミング/Javaプログラミング関連情報

Java5の新文法をマスターしよう(2ページ目)

既にJava6の時代となりつつある今。Java5からサポートされた新文法についてしっかり理解しておきましょう。

執筆者:掌田 津耶乃

総称型で利用可能なクラスを固定する


例えば、mainメソッドでlist.addしている部分で、String以外のオブジェクトをaddしたらどうなるでしょうか。やってみましょう。

  public static void main(String[] args) {
    MyData mydata = new MyData();
    mydata.list.add("Welcome");
    mydata.list.add("to");
    mydata.list.add(new Integer(100));
    mydata.printAll();
  }


これは、実はコンパイルは問題なく通ります。ちゃんとクラスは作成されるのです。が、実際に実行をしてみると、ClassCastExceptionが発生します。これは考えてみれば当然で、printAllの際、String s = (String)iterator.next();というように取得したオブジェクトをStringにキャストしているため、Integerインスタンスがキャストに失敗し例外を発生させるのですね。

こういう場合に用いられるのが総称型です。総称型は、コレクション関係のクラスで「中に収めることのできる型(クラス)を固定する」という働きをします。これは、以下のようにしてインスタンスを作成することで利用できます。

クラス <型> 変数 = new クラス <型> ();


通常、インスタンスの作成は「new クラス ()」というようにしておこないますが、クラス名の後に<>記号で型を指定することで、その型のオブジェクトしか収めることのできないインスタンスを作ることができるのです。では、これを使ってMyDataを修正してみましょう。

class MyData {
  public ArrayList<String> list = new ArrayList<String>();
  
  public void printAll() {
    Iterator<String> iterator = list.iterator();
    while(iterator.hasNext()) {
      String s = iterator.next();
      System.out.print(s + " ");
    }
  }
}


こんな感じになります。これで、ArrayListのフィールドにはStringインスタンスしか納めることができなくなります。また取得するIteratorにも総称型を使うことで、同じくStringしか扱えないIteratorを得ることができます。

これにより、もしこのArrayListにString以外のオブジェクトをaddしようとすると、コンパイル時にエラーが発生し、コンパイル自体ができなくなってしまいます。このArrayListには、Stringしか収められていないことが保障されるのです。

また、総称型を使うことで、取り出したオブジェクトをキャストする必要がなくなります。printAllでiterator.nextしている値は、(String)のキャスト指定がされていません。そのままString変数に代入して使うことができるのです。

総称型により、「誤った種類の値をコレクションで利用してしまう危険」を排除することができます。特にプログラムが複雑になってくると、コレクションにどこでどんな値が収められるかが追いきれなくなってくることもあるでしょう。そんなとき、総称型を使うことで、予想しなかった値が紛れ込む危険を取り除けるのです。


  • 前のページへ
  • 1
  • 2
  • 3
  • 5
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます