此代码会导致 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
simple一样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;
}