このコードは、javac でコンパイル エラーを引き起こします (ただし、特に Eclipse 4.2.2 ではそうではありません!)。
public interface Foo<T> {
}
class Bar<T> implements Foo<Iterable<T>> {
}
class Test {
void test(Foo<? extends Iterable<? extends String>> foo) {
Bar<?> bar = (Bar<?>) foo;
}
}
javac からのエラーは次のとおりです。
Foo.java:9: error: inconvertible types
Bar<?> bar = (Bar<?>) foo;
^
required: Bar<?>
found: Foo<CAP#1>
where CAP#1 is a fresh type-variable:
CAP#1 extends Iterable<? extends String> from capture of ? extends Iterable<? extends String>
キャストを に変更すると(つまり、生の型を使用して)、 の型を単純に に(Bar) foo
変更した場合と同様に、コードをコンパイルできます。foo
Foo<? extends Iterable<?>>
編集: 面白いことに、この単純な変更により、Eclipse は拒否されますが、javac は受け入れます:
void test(Foo<Iterable<String>> foo) {
Bar<?> bar = (Bar<?>) foo;
}
そして、Eclipse と javac の両方がこれを拒否します。
void test(Foo<Iterable<? extends String>> foo) {
Bar<?> bar = (Bar<?>) foo;
}