Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型铸造问题_Java_Generics - Fatal编程技术网

Java 泛型铸造问题

Java 泛型铸造问题,java,generics,Java,Generics,我的问题是:考虑到这些课程 class A {} class B extends A {} 此代码编译: List<Class<? extends A>> list = Arrays.asList(B.class, A.class); List这是泛型中的协方差/逆变换问题。以下SO问题应有助于您理解和解决问题: 问得好,我不知道答案,但这里有一个解决办法: List<Class<? extends A>> numbers = new

我的问题是:考虑到这些课程

class A {}
class B extends A {}
此代码编译:

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

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


问得好,我不知道答案,但这里有一个解决办法:

List<Class<? extends A>> numbers = new ArrayList<Class<? extends A>>(Arrays.asList(B.class));
列表
被概括为

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

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

在第一个示例中,
Arrays.asList()
调用的推断类型为
List,这将编译:

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

List只需添加,我们可以按如下方式重写代码

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

list你能给我一个指向JLS或Sun教程的指针,我可以在那里读到它吗?明白。您能告诉我JLS/Sun教程在哪里可以阅读推理工作?Java泛型教程@Victor JLS的相关部分似乎是这样的:教程大多提到类型推理确实发生,但没有详细说明。我的直觉理解是,类型推断试图找到与所有方法的编译时类型匹配的最具体的类型参数。+1这是正确的解决方案。显式指定参数,因为它与推断的参数不同。第一行不是为我编译的
List<Class<B>> bb = new ArrayList<B>();
List<Class<? extends A>> aa = bb;
aa.add(A.class);
List<Class<? extends A>> numbers = Arrays.<Class<? extends A>>asList(B.class);
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