这是我的问题:给定以下类
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中编译。显然是因为“改进的类型推断”。
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>>
。List<B>
不能被分配给 List<A>
的原因相同。如果可以,将可能会导致以下(不安全)代码的出现:List<Class<B>> bb = new ArrayList<B>();
List<Class<? extends A>> aa = bb;
aa.add(A.class);
这会编译:
List<Class<? extends A>> numbers = Arrays.<Class<? extends A>>asList(B.class);
Arrays.asList(B.class);
List<Class<B>> numbers = Arrays.asList(B.class);
因为它只有一个类型为T
的属性与参数化类型匹配(在本例中为B.class
)。
List<Class<? extends A>> numbers = new ArrayList<Class<? extends A>>(Arrays.asList(B.class));
补充一下,我们可以将代码重写如下
List<Class<? extends A>> asListA = Arrays.asList(B.class, A.class);
List<Class<B>> asListB = Arrays.asList(B.class);
List<Class<? extends A>> numbers = asListA;
List<Class<? extends A>> numbers2 = asListB; // it will fail here
而@Inerdia已经解释了细节。