在Java中我可以演员:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
那么为什么以下失败?
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
答案 0 :(得分:6)
在您的1 st 代码段中:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
编译器不会给你错误,因为List<?>
是List<Integer>
的超类型,因为通配符"?"
表示的类型系列是{{1}的超集}}。所以你可以执行从Integer
到List<?>
的转换(你可以说是一个向下转换),但是编译器会显示一个未经检查的警告,以保存你免于投射从说 - List<Integer>
到List<Date>
。显示警告,因为由于类型擦除,转换将在运行时成功。
在2 nd 案例中:
List<Integer>
在这里,您要从List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
(由 FIRST 引用)转换为List<List<?>>
(从此处引用 SECOND )。
因为, FIRST 不是超级类型的 SECOND ,显然是因为List<List<Integer>>
表示的类型系列(它可以是List<?>
,List<Long>
,List<Date>
或其他任何内容)不是List<String>
的超级集合。因此,编译器错误。
建议阅读:
答案 1 :(得分:3)
尝试:
List<? extends List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
来源(此来源将参考其他重要来源):
答案 2 :(得分:0)
我猜你需要做一个通配符转换才能把它转换成你想要的。
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>) (List<?>) i;
编译好。你只需要做一个额外的演员只是为了添加一点缓冲。
如果您想知道原因,请查看here
基本上,这是相关信息 这是另一种看待它的方式:
List<Integer>
不是List<Number>
List<Integer>
可以由List<?>
进行捕获转换,但List<List<Integer>>
不是List<List<?>>
List<? extends Number>
可以捕获转换List<Integer>
List<? extends List<?>>
可以捕获转换List<List<Integer>>