16

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;
4

3 回答 3

6

在您的第一个片段中:

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>。因此出现编译器错误

推荐阅读:

于 2013-08-06T19:17:48.393 回答
4

尝试:

List<? extends List<?>> i = null;

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

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

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

于 2013-08-06T19:14:52.493 回答
1

我猜您需要进行通配符转换才能将其转换为您想要的。

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

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

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

  • Java 泛型是类型不变的
  • 有从整数到数字的转换,但 aList<Integer>不是 aList<Number>
  • 类似地, aList<Integer>可以被 a 捕获转换List<?>,但 aList<List<Integer>>不是 aList<List<?>>
  • 使用有界通配符,aList<? extends Number>可以捕获-转换 aList<Integer>
  • 同样,aList<? extends List<?>>可以捕获-转换 aList<List<Integer>>
于 2013-08-06T19:12:04.347 回答