2014-10-02 97 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