如何在Java中正确转换嵌套泛型类型

如何在Java中正确转换嵌套泛型类型,java,generics,casting,Java,Generics,Casting,在Java中,我可以强制转换: List<?> j = null; List<Integer> j2 = (List<Integer>)j; List j=null; 列表j2=(列表)j; 那么,为什么下面的方法失败了呢 List<List<?>> i = null; List<List<Integer>> i2 = (List<List<Integer>>)i; List我猜您需

在Java中,我可以强制转换:

List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
List j=null;
列表j2=(列表)j;
那么,为什么下面的方法失败了呢

List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;

List我猜您需要执行通配符转换,才能将其转换为您想要的内容

List<?> j = null;
List<Integer> j2 = (List<Integer>)j;

List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>) (List<?>) i;
List j=null;
列表j2=(列表)j;
列出试试:

List>i=null;
列表i2=(列表)i;
来源(此来源将参考其他重要来源):

在您的第一段代码中:

在这里,您正在从
列表
(它可以是
列表
列表
列表
或任何内容)进行强制转换,而不是
列表
的超集。因此出现了编译器错误

建议阅读:


错误信息是什么?这很好地解释了这一点:两种类型都是一个非常糟糕的想法,只是第一种类型是可疑的(无法证明是正确的),后一种类型是完全错误的。但是,您可以将
列表
转换为
列表
——因为
可以代表任何东西,包括
列表
。我只是再查了一下,发现了另一个stackoverflow帖子,解释了原因,请检查我的编辑。在我发布之前,我没有看到这一点,因为它提供了另一个解决方案唯一能真正回答如何做这一问题的答案有最少的投票:/“[…]用
List
[…]表示的类型族不是
List
的超集。实际上是!任何
List
类型的对象都与更一般的
List
类型相匹配。
List<? extends List<?>> i = null;

List<List<Integer>> i2 = (List<List<Integer>>)i;
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;