拡張for文のちょっと便利な使い方


Java 7 以上で確認した.次のようなクラスA, B, Xがあるとする。

public class A {
}
public class B<T> extends A {
}
public class X {
    public static <Z extends A> java.util.List<Z> get(Class<Z> clazz) {
        // dummy implementation
        return new ArrayList<Z>(); // ArrayList<>() is also valid in case of Java 8.
    }
}

このとき、X#get()を用いてBのインスタンスのリストを取得するために以下のように書こうとすると、

List<B<?>> list = X.get(B.class);

次のコンパイルエラーになる。List<B<?>> へのキャストもできない。

Type mismatch: cannot convert from List<B> to List<B<?>>

ところが、以下のように拡張For文を用いてリストの要素を1つずつ取得すると、コンパイルエラーも警告も出なくなる。
フレームワークを作成する場合に少し便利なイディオムである。

for (B<?> b : X.get(B.class)) {
    // do something with b.
}