generics投射问题

这是我的问题:给出这些课程

class A {} class B extends A {} 

此代码编译:

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

而这不是:

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

是什么赋予了?


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

在第一个例子中, Arrays.asList()调用的推断类型是List> List> ,显然可以赋予相同类型的变量。

在第二个示例中,右侧的类型是List>Class可分配给Class ClassList> 不能分配给List> List> 。 它可以分配给List> List> List>

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

 List> bb = new ArrayList(); List> aa = bb; aa.add(A.class); 

这将编译:

 List> numbers = Arrays.>asList(B.class); 
 Arrays.asList(B.class); 

被广泛认为是

 List> numbers = Arrays.asList(B.class); 

因为它只有一个类型为T属性与参数化类型匹配(在本例中为B.class )。

该死的好问题,我不知道答案,但这是一个解决方法:

 List> numbers = new ArrayList>(Arrays.asList(B.class)); 

只是添加,我们可以重写代码如下

 List> asListA = Arrays.asList(B.class, A.class); List> asListB = Arrays.asList(B.class); List> numbers = asListA; List> numbers2 = asListB; // it will fail here 

@Inerdia已经解释了细节。

这是generics中的协方差/逆变量问题。 以下SO问题应该可以帮助您理解和解决问题:

展示Java中的协方差和逆变?

如何在Javagenerics中使用逆变?