<< 2006/01/18 | Home | 2006/01/20 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

Java Generics and Collections

今日は時間が無かったけど電車の中で第三部を読んでみた。ワイルドカードを使ったイミュータブルの試みというのが面白い。

public class Test {
    public List<? extends Integer> getResult() {
        return Arrays.asList(1, 2, 3);
    }

    public static void main(String[] args) {
        Test test = new Test();
        List<? extends Integer> list = test.getResult();
        list.add(1);
    }
}
$ javac -Xlint:unchecked Test.java
Test.java:11: シンボルを見つけられません。
シンボル: メソッド add(int)
場所    : java.util.List の インタフェース
        list.add(1);
            ^
エラー 1 個

始めは正直、意味不明だった。"extends Integer"って、Integerはfinalですが、とか、List<? extends Integer>だったらIntegerと、そのサブタイプのインスタンスは入れられるんじゃないの? とか。

List<? extends Integer>っていうのは、仮にIntegerが継承可能でSubIntegerとかがあったら、List<SubInteger>の参照も保持できるってことだ。ここにIntegerのインスタンスを放り込むのは当然エラー(もちろん逆、つまりList<Integer>にSubIntegerを放り込むならok)。だからコンパイルエラーなのだ。で、それを利用してlistを変更不可にしているというわけだ。

もちろん、資料にもあるようにclear()とかremove()が防げるわけじゃないし、nullは素通りするので、これは止めましょうと書いてある。ただGenericsの理解を深めるという点では面白い例だ。

もちろんキャストで回避できるのだけど、unchecked警告が出る。

    public static void main(String[] args) {
        Test test = new Test();
        List<Integer> list = (List<Integer>)test.getResult();
        list.add(1);
    }
$ javac Test.java
注: Test.java の操作は、未チェックまたは安全ではありません。
注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。

$ javac -Xlint:unchecked Test.java
Test.java:10: 警告: [unchecked] 無検査キャストです
検出値  : java.util.List<capture of ? extends java.lang.Integer>
期待値  : java.util.List<java.lang.Integer>
        List<Integer> list = (List<Integer>)test.getResult();

これって、javacもデフォルトだと控えめに報告するから軽く見ていたのだけど(何せlintだし)、この資料を読んでみて、一部の例外を除けば、基本的には全部つぶしておかないといけないものだというのが良く分かった。さもないと、思わぬところで(その場所では明示的にはキャストをしていない)、原因不明のClassCastExceptionが起きてしまう。

String.indexOf()

String.indexOf()って順次検索なのか...遅いわけだ。

Safari Bookshelf

Safari Bookshelfというのに申し込んでみた。月額$20払うと、10スロット分の場所がもらえて、そこに入る分だけの本をオンラインで閲覧、内容の検索などできる。本は1冊あたり2スロット程度消費する。それとは別にダウンロードコインというのが月5枚提供されて、これを使ってダウンロードが出来てオフラインで読める。5枚使っちゃったらコインだけ買うことも出来て5枚で$10。ただこれはかなり高い感じで、10ページ程度で1コイン使う感じになる。全部ダウンロードするのではなく、オンラインで立ち読み(?)して、一部だけ欲しかったらここでダウンロード、全部欲しかったら別のサイトでpdf版を買った方がいい感じだ。

このSafari Bookshelfって色んな本屋でやっているようで、手続きした後、飯食ってから「どこだっけ?」といいかげんにグーグルさんに聞きながら行ったら、別の本屋のSafari Bookshelfに行ってしまいパスワードが違うといわれて焦ってしまった。なんかアメリカのオンライン書店はどんどん進んでいくね。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8