泛型投射问题

时间:2011-11-11 12:07:42

标签: java generics

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

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);

是什么给出了?


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

6 个答案:

答案 0 :(得分:14)

在第一个示例中,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);

答案 1 :(得分:5)

这将编译:

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

答案 2 :(得分:2)

Arrays.asList(B.class);

被认为是

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

只需添加,我们可以重写下面的代码

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已经解释了细节。

答案 5 :(得分:0)

这是泛型中的协方差/逆变量问题。以下SO问题应该有助于您理解和解决问题:

Demonstrate covariance and contravariance in Java?

How would contravariance be used in Java generics?