2012年2月27日

ありえないキャスト

こんな感じのクラスがあって、
public class HogeValue {

    private List fugaList = null;

    public void setFugaList(List fugaList) {
        this.fugaList = fugaList;
    }

    public List getFugaList() {
        return fugaList;
    }
}
こんな感じで使っていました。
        HogeValue hoge = createHoge();
        List fuga = hoge.getFugaList();

        for (Object o : fuga) {
            Map map = (Map) o;
            System.out.println("key1:" + map.get("key1"));
            System.out.println("key2:" + map.get("key2"));
        }
思わずなんじゃこりゃ、と言ってしまいました。 List型FugaValueを無視して、Objectでfor-eachのループを回し、中でMapにキャストしています。 「ClassCastException発生しないの?落ちないの?」 と聞いたところ、「落ちません、Listの中はなんかMapになるのです」 なんて言われました。 腑に落ちない。。。。

でも、実際、動いちゃうんです、このソース。

動くのを見て、ようやく気付きました。 総称型ってコンパイルしたら消えるじゃーん。 なので、まず、コンパイルエラーにはならない。

じゃあ、ClassCastExceptionは?

このHogeValueに値を設定しているのは、StrutsのActionFormでした。 詳しく調べていないけど、BeanUtilsとかでリフレクション使って設定してるんでしょうな。 だから、コンパイルエラーにもなりません。 で、BeanUtilsでMapがセットされるようになってた、と。
こんなこともできるんだな、とちょっと関心(?)しました。

0 コメント:

コメントを投稿