In Java I can cast:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
So why does the following fail?
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
在您的第一个片段中:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
编译器不会给你错误,因为List<?>
它是 的超类型List<Integer>
,因为通配符表示的类型族"?"
是 的超集Integer
。因此,您可以执行从List<?>
toList<Integer>
的转换(可以说是向下转换),但是编译器会向您显示Unchecked Warning,以防止您从 say- List<Date>
to 进行转换List<Integer>
。显示警告,因为由于类型擦除,强制转换将在运行时成功。
在第二种情况下:
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
在这里,您正在从List<List<?>>
(以下简称FIRST)转换为List<List<Integer>>
(以下简称SECOND)。
因为,FIRST不是SECOND的超类型,显然是因为List<?>
(它可以是List<Long>
、List<Date>
或List<String>
任何东西)表示的类型族不是 的超集List<Integer>
。因此出现编译器错误。
推荐阅读:
尝试:
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>>) (List<?>) i;
这编译得很好。你只需要做一个额外的演员只是为了添加一点缓冲区。
见这里:http: //ideone.com/xh88lX
如果您想知道原因,请查看此处
基本上,这里是相关信息这是另一种看待它的方式:
List<Integer>
不是 aList<Number>
List<Integer>
可以被 a 捕获转换List<?>
,但 aList<List<Integer>>
不是 aList<List<?>>
List<? extends Number>
可以捕获-转换 aList<Integer>
List<? extends List<?>>
可以捕获-转换 aList<List<Integer>>