泛型转换问题

2022-09-03 01:30:12

这是我的问题:给定这些类

class A {}
class B extends A {}

此代码编译:

    List<Class<? extends A>> list = Arrays.asList(B.class, A.class);

这不会:

    List<Class<? extends A>> anotherList = Arrays.asList(B.class);

什么原因?


更新:此代码在 Java 8 中编译。显然,由于“改进的类型推断”。


答案 1

在第一个示例中,调用的推断类型是 ,这显然是可以分配给相同类型的变量的。Arrays.asList()List<Class<? extends A>>

在第二个示例中,右侧的类型为 。虽然 可分配给 ,则不可分配给 。它将可分配给 。List<Class<B>>Class<B>Class<? extends A>List<Class<B>>List<Class<? extends A>>List<? extends Class<? extends A>>

其原因与 a 不可分配给 的原因相同。如果是这样,它将使以下(非类型安全)代码成为可能:List<B>List<A>

List<Class<B>> bb = new ArrayList<B>();
List<Class<? extends A>> aa = bb;
aa.add(A.class);

答案 2

这将编译:

List<Class<? extends A>> numbers = Arrays.<Class<? extends A>>asList(B.class);

推荐