这是我的问题:给出这些类
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中编译。显然,由于“改进了类型推断”。
答案 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问题应该有助于您理解和解决问题: