Java Generics:无限制的通配符泛化不能超过二级

时间:2014-10-02 01:28:18

标签: java generics

我想这是一个非常令人困惑的标题,但我不知道还有什么可以调用 - 也许在某处也可以回答,但我找不到任何东西。举个例子:

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<?>,它也会有效。但是当仿制药深入两个以上时,似乎停止了工作。任何原因/解决方法/等?

1 个答案:

答案 0 :(得分:4)

请注意,即使List<B>List<A>的子类型,B也不是A的子类型。因此,即使您可以将List<Class<? extends Integer>>对象分配给List<Class<?>>变量,Class<? extends Integer>也不是Class<?>的子类型。在bar中考虑一下,调用a.add(Object.class)是合法的,因为Class<Object>Class<?>的子类型。

因此,您希望将bar参数类型扩展为List<? extends Class<?>>