<< 2006/01/04 | Home | 2006/01/06 >>
PR: 転職    転職サイト    転職    英会話    滋賀    美容室    ニキビ    英会話    転職サイト    化粧品   

Genericsむずい

Generics、やっぱり難しいな〜。Java Generics and Collectionsって、内容的にはここにあるpdfと比べて、どのくらい加筆されてるんだろう。買ってもしょうがないかな〜。とはいえこれより詳しい本って無さそうだし。この値段なら買っておくしかないか。ってまだ出てませんな。

1対多の関係を作ろうとして

class Child {
}
class Parent<CHILD_T extends Child> {
    Collection<CHILD_T> children;

    Iterator<CHILD_T> iterator() {
        return children.iterator();
    }
}

まぁ、この辺まではいい。で、子から親にもリンクを張ろうとして、

class Child<PARENT_T extends Parent> {
    PARENT_T parent;
    PARENT_T getParent() {
        return parent;
    }
}

この辺から怪しい。Childに型パラメータが付いたわけだから、Parent側の

Parent<CHILD_T extends Child>

のChildに型パラメータが付いていないってことは、Objectなわけで、

Parent<CHILD_T extends Child<Object>>

ってことになる(はず。自信なし)。それが証拠に、

class Child<PARENT_T extends Parent> {
    PARENT_T parent;
    PARENT_T getParent() {
        return parent;
    }

    void bar() {
        parent.foo(this);
    }
}
class Parent<CHILD_T extends Child> {
    Collection<CHILD_T> children;

    Iterator<CHILD_T> iterator() {
        return children.iterator();
    }

    void foo(CHILD_T child) {
    }
}
$ javac -Xlint:unchecked Child.java Parent.java
Child.java:10: 警告: [unchecked] raw 型 Parent のメンバとしての foo(CHILD_T) へ
の無検査呼び出しです。
        parent.foo(this);
                  ^
警告 1 個

やっぱりね〜。ってことはえ〜と、

class Parent<CHILD_T extends Child<? extends Parent<CHILD_T>>> {
class Child<PARENT_T extends Parent<? extends Child<PARENT_T>>> {

ですか? もうわけわからなくなってる。

$ javac -Xlint:unchecked Child.java Parent.java
Child.java:10: foo(? extends Child<PARENT_T>) (Parent<? extends Child<PARENT_T>>
 内) を (Child<PARENT_T>) に適用できません
        parent.foo(this);
              ^
エラー 1 個

Child<PARENT_T>の継承型を受け取れるメソッドに、どうしてChild<PARENT_T>が渡せないですか? もう理解不能。もう一度pdfを熟読してみよう...

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