2014-10-02 54 views
4

我想這是一個令人困惑的標題,但我不知道還有什麼要調用 - 也許在某處回答,但我什麼也找不到。拿這個例子:Java泛型:無界通配符泛化不能通過第二級

List<Class<? extends Integer>> myList; 
void foo() { 
    bar(myList); 
} 
void bar(List<Class<?>> a) { /* ... */ } 

它不編譯(不適用的參數,它說)。如果我刪除的邊界,它工作正常:

List<Class<?>> myList; 
void foo() { 
    bar(myList); 
} 
void bar(List<Class<?>> a) { /* ... */ } 

Class<? extends Integer>只比Class<?>更具體。它如何停止工作?請注意,此問題僅在第二級泛型中出現。如果沒有列表,只需Class<? extends Integer>Class<?>,它也可以。但是當仿製藥深入兩層或更多層時似乎停止了工作。任何原因/解決方法/等?

回答

4

請注意,即使BA的子類型,List<B>也不是List<A>的子類型。因此,即使您可以將Class<? extends Integer>對象分配給Class<?>變量,List<Class<? extends Integer>>也不是List<Class<?>>的子類型。請考慮在bar中,調用a.add(Object.class)是合法的,因爲Class<Object>Class<?>的子類型。

因此,您需要將bar參數類型擴展爲List<? extends Class<?>>

+0

不錯,它的工作方式!我想最終會產生某種感覺...... – 2014-10-02 09:46:44