倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

ムリヤリ拡張 for 文を使う

Java 5 以降で Generics に対応していないライブラリを使用する際に、拡張 for 文を(無理矢理)使用する方法をご紹介。 堅牢性に重きを置くプロジェクトでは使わない方がよいかと思いますが。

以下のサンプルでは、Element は「org.dom4j.Element」で、XML 文書の「要素」をモデル化しています。 そこには子要素をリスト(java.util.List オブジェクト)として取得するメソッド「elements()」が定義されています。 この返り値のリストに含まれているオブジェクトはまた全て Element 型です。

従来の方法


拡張 for 文を使った従来の方法では、子要素を列挙するために Object 型を用いて、それを従来の型にキャストしなければなりません:

void someMethod(Element e){

  for(Object childObj: e.elements()){
    Element child = (Element)childObj;
    ...
  }
}

要素をキャストしなくてもよい方法


拡張 for 文の後の引数の部分を Generic なコレクションにキャストすると、上記の要素をキャストする1行が不要になります:

void someMethod(Element e){

  for(Element child: (List<Element>)e.elements()){
    ...
  }
}

ただし、このままでは「型の安全性」に関する警告が報告されます。

警告を無視するようにする


これはあまりよくない方法ですが、上記の警告を無視するように、メソッドに @SuppressWarnings アノテーションを付加します:

@SuppressWarnings("unchecked")
void someMethod(){

  for(Element child: (List<Element>)e.elements()){
    ...
  }
}

警告を無視するのは少々怖いので、この方法はテストコード内などでだけ使用することをお勧めします。