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 extends A>
Class extends A>
, List
不能分配给List
List
。 它可以分配给List extends Class extends A>>
List extends Class extends A>>
List extends Class extends A>>
。
其原因与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中使用逆变?