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

2022-09-03 07:35:12

在Java中,我可以投射:

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

那么,为什么以下方法会失败呢?

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

答案 1

在您的第 1个代码段中:

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

编译器不会给你错误,因为它是 的超类型,因为通配符表示的类型族是 的超集。因此,您可以执行从 到 的强制转换(可以说是向下转换),但编译器将显示“未选中的警告”,以节省从 say - 到 .将显示该警告,因为由于类型擦除,强制转换将在运行时成功。List<?>List<Integer>"?"IntegerList<?>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>

推荐阅读:


答案 2

尝试:

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

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

来源(此来源将引用其他重要来源):

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


推荐