我有一个Class对象列表,所有这些对象都需要扩展一个泛型类.这是我的代码:
private final List<Class<? extends A<?>>> CLASS_LIST =
Arrays.asList(B.class, C.class, D.class);
// Base class
private abstract class A<T extends Object> {}
// Some class that extends A
private class B extends A<String> {}
// Some other class that extends A
private class C extends A<String> {}
// A class that extends A, but with a different type than the first two
private class D extends A<OtherClass> {}
private static class OtherClass {}
这工作正常,但如果我从列表中删除D.class我得到一个错误说:
Incompatible types, Required A<?>, found A<String>
为什么会这样?我假设Java推断出类型……但为什么呢?它有办法吗?我发现如果我使用List<?>它适用于所有情况,但后来我失去了类型安全.
编辑:
另外,如果我有这个方法:
private void Check(){
A a = new B();
if(CLASS_LIST.contains(a.getClass())){
// Do something
}
}
它给了我一个对List.contains(…)的可疑调用的警告.但是,如果我使用List<?>,则警告会消失….为什么会这样?
EDIT2:
Java 1.8.0_51-b16编译,但Java 1.7.0_79给出了错误.
最佳答案 当你写作时,你是对的
Arrays.asList(B.class, C.class)
编译器(1.7,1.8在类型推断方面稍微好一点)推断出一种类<?扩展A< String>>从它的参数,它与赋值不兼容.您可以通过指定所需的类型来解决此问题:
Arrays.<Class<? extends A<?>>>asList(B.class, C.class)