泛型投射问题

Vic*_*kin 17 java generics

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

class A {}
class B extends A {}
Run Code Online (Sandbox Code Playgroud)

此代码编译:

    List<Class<? extends A>> list = Arrays.asList(B.class, A.class);
Run Code Online (Sandbox Code Playgroud)

而这不是:

    List<Class<? extends A>> anotherList = Arrays.asList(B.class);
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?


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

mil*_*ose 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>>.

其原因与a List<B>无法分配的原因相同List<A>.如果是,它将使以下(非类型安全)代码成为可能:

List<Class<B>> bb = new ArrayList<B>();
List<Class<? extends A>> aa = bb;
aa.add(A.class);
Run Code Online (Sandbox Code Playgroud)


H-M*_*an2 5

这将编译:

List<Class<? extends A>> numbers = Arrays.<Class<? extends A>>asList(B.class);
Run Code Online (Sandbox Code Playgroud)