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

时间:2013-08-06 19:01:47

标签: java generics casting

在Java中我可以演员:

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

那么为什么以下失败?

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

3 个答案:

答案 0 :(得分:6)

在您的1 st 代码段中:

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

编译器不会给你错误,因为List<?>List<Integer>的超类型,因为通配符"?"表示的类型系列是{{1}的超集}}。所以你可以执行从IntegerList<?>的转换(你可以说是一个向下转换),但是编译器会显示一个未经检查的警告,以保存你免于投射从说 - 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;

来源(此来源将参考其他重要来源):

https://stackoverflow.com/a/3575895/2498729

答案 2 :(得分:0)

我猜你需要做一个通配符转换才能把它转换成你想要的。

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

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

编译好。你只需要做一个额外的演员只是为了添加一点缓冲。

见这里:http://ideone.com/xh88lX

如果您想知道原因,请查看here

基本上,这是相关信息 这是另一种看待它的方式:

  • Java泛型是类型不变的
  • 有从Integer到Number的转换,但List<Integer>不是List<Number>
  • 同样,List<Integer>可以由List<?>进行捕获转换,但List<List<Integer>>不是List<List<?>>
  • 使用有界通配符,List<? extends Number>可以捕获转换List<Integer>
  • 同样,List<? extends List<?>>可以捕获转换List<List<Integer>>