如何在 Java 中正确转换嵌套泛型类型
在Java中,我可以投射:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
那么,为什么以下方法会失败呢?
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
在Java中,我可以投射:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
那么,为什么以下方法会失败呢?
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
在您的第 1个代码段中:
List<?> j = null;
List<Integer> j2 = (List<Integer>)j;
编译器不会给你错误,因为它是 的超类型,因为通配符表示的类型族是 的超集。因此,您可以执行从 到 的强制转换(可以说是向下转换),但编译器将显示“未选中的警告”,以节省从 say - 到 .将显示该警告,因为由于类型擦除,强制转换将在运行时成功。List<?>
List<Integer>
"?"
Integer
List<?>
List<Integer>
List<Date>
List<Integer>
在第二种情况下:
List<List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
在这里,您从(从现在开始由FIRST引用)到(从此处由SECOND引用)。List<List<?>>
List<List<Integer>>
因为,FIRST 不是 SECOND 的超类型,这显然是因为用 (它可以是 、 、 或任何东西) 表示的类型家族不是 的超集。因此,编译器错误。List<?>
List<Long>
List<Date>
List<String>
List<Integer>
推荐阅读:
尝试:
List<? extends List<?>> i = null;
List<List<Integer>> i2 = (List<List<Integer>>)i;
来源(此来源将引用其他重要来源):