如何创建List<String>类型数组及将List<List<String>>转换为该数组
如何创建List类型数组及转换List<List>为该类型数组?
Java之所以会报"generic array creation"错误,核心原因是泛型的类型擦除机制——运行时泛型类型信息会被擦除,编译器无法保证泛型数组的类型安全性,因此禁止直接创建泛型数组。下面是具体的解决方法:
一、直接创建List类型数组
可以先创建非泛型的List[]数组,再通过强制类型转换得到List<String>[]:
// 会产生unchecked警告,需自行确保后续操作的类型安全 List<String>[] array = (List<String>[]) new List[10];
如果要消除编译器的unchecked警告,可以添加注解:
@SuppressWarnings("unchecked") List<String>[] array = (List<String>[]) new List[10];
二、将List<List>转换为List类型数组
方法1:使用Collection.toArray()方法
直接创建非泛型的List[]作为容器,再强制转换:
List<List<String>> results = new ArrayList<>(); // 传入长度为0的数组,JDK会自动根据集合大小创建对应长度的数组 List<String>[] array = (List<String>[]) results.toArray(new List[0]);
或者指定数组长度为集合大小,避免额外的数组创建:
List<String>[] array = (List<String>[]) results.toArray(new List[results.size()]);
方法2:结合Stream API转换
Stream的toArray()方法同样不能直接创建泛型数组,需要先转为Object[]再强制转换:
List<String>[] array = (List<String>[]) results.stream().toArray(Object[]::new);
注意事项
- 上述方法都会产生unchecked警告,这是编译器无法验证转换安全性的提示,只要你能确保集合/数组中只会存入
List<String>类型的元素,就不会出现运行时异常。 - 除非业务必须使用数组,否则更推荐用
List<List<String>>代替泛型数组,这更符合Java泛型的设计初衷,能从根源避免潜在的类型安全问题。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

