爲什麼Bar.go
是OK
帶有參數f2
但不帶參數f1
?多級別通用類型的Java通配符
public class HelloWorld {
public static void main(String[] args) {
Foo<Foo<?>> f1 = new Foo<Foo<?>>();
Foo<Foo<String>> f2 = new Foo<Foo<String>>();
Bar.go(f1); // not OK
Bar.go(f2); // OK
}
public static void p(Object o) {
System.out.println(o);
}
}
class Foo<E> {
}
class Bar {
public static <T> void go(Foo<Foo<T>> f) {
}
}
不應該編譯器自動推斷T
類型,在兩種情況下capture of ?
?
很高興看到工作示例。 – Cyker
'Foo>'的情況如何?如果我需要以'Foo >'的方式工作,我可以寫'Foo <? '延伸Foo >>'但我覺得它會帶來更多的差異,我實際上會打算如果我能夠使用'Foo >'。根據方差來調用'Foo '作爲'Foo >'如何接受? –
ony
如果我理解你的問題@ony,它根本不接受它。 'Foo>'不是'Foo < Foo< ? >>'。一般而言,即使'S'是'T','G < S >'也不是'G < T >',而'G < S >'是'G <?擴展T>'和'G < T >'是'G < ? super S >'。 'Foo < ? >'是Foo <?的簡稱嗎?擴展Object>',所以'Foo < String >'是'Foo < ? >'。但讓'Foo < String >'爲'S'並且'Foo < ? >'爲'T'。上面的非關係意味着'Foo < S >'不是'Foo < T >'。 –