我想这是一个非常令人困惑的标题,但我不知道还有什么可以调用 - 也许在某处也可以回答,但我找不到任何东西。举个例子:
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<?>
,它也会有效。但是当仿制药深入两个以上时,似乎停止了工作。任何原因/解决方法/等?
答案 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<?>>
。