java – 泛型类列表的奇怪错误

我有一个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)
点赞