次のインターフェースと実装クラスがあるとしましょう。
interface Foo<FooType extends Foo<FooType>> {
FooType copy();
}
class Bar implements Foo<Bar> {
public Bar copy() {
return new Bar();
}
}
私がこれをやろうとすると:
public <FooType extends Foo<FooType>> FooType getFoo() {
return new Bar();
}
「タイプの不一致:BarからFooTypeに変換できません」というコンパイルエラーが発生します。なんで?
次のように関数を書き直すことで、これを「修正」できます。
@SuppressWarnings("unchecked")
public <FooType extends Foo<FooType>> FooType getFoo() {
return (FooType) new Bar();
}
しかし、私がこのような関数を持っているとしましょう:
public <FooType extends Foo<FooType>> void printFoo(FooType foo) {
System.out.println(foo.toString());
}
私がこれをやろうとすると:
printFoo(getFoo());
次のコンパイルエラーが発生します。
Bound mismatch: The generic method printFoo(FooType) is not applicable
for the arguments (Foo<Foo<FooType>>). The inferred type Foo<Foo<FooType>>
is not a valid substitute for the bounded parameter <FooType extends Foo<FooType>>
ワット?getFoo()の戻り型は、printFoo()の引数型と文字通り同じです。
これらのバグですか、それとも何かが足りませんか?