此代碼會導致用javac編譯錯誤(但是,值得注意的是,不使用Eclipse 4.2.2!):爲什麼在這裏不允許轉換爲「GenericType <?>」?
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;
}
希望你永遠不必像這樣做任何醜陋的鑄造,這只是一個好奇的問題... – jahroy
是的只是好奇心。真實生活中的例子實際上是「instanceof Bar」工作但「instanceof Bar >」沒有的檢查實例。 –
這裏有一些提及,http://docs.oracle.com/javase/tutorial/java/generics/capture.html –