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を熟読してみよう...




