Java中如何以类型安全的方式声明存储List的二维数组
Java实现类型安全的List二维数组存储方案
报错原因
Java 泛型基于类型擦除实现,运行时会抹除泛型参数信息;而数组是协变类型,运行时会严格检查元素的实际类型。两种机制的底层设计冲突,导致Java不允许直接实例化携带具体泛型参数的数组,因此 new List<String>[MAX_ROWS][MAX_COLS] 会直接编译失败。
可行解决方案
方案1:使用嵌套List(完全类型安全,优先推荐)
放弃数组结构,改用三层嵌套的List实现二维存储,全程由编译器做类型检查,无任何警告:
import java.util.ArrayList; import java.util.List; public class Test { private static final int MAX_ROWS = 2; private static final int MAX_COLS = 5; private List<List<List<String>>> _stringSets; public Test() { // 初始化行 _stringSets = new ArrayList<>(MAX_ROWS); for(int row = 0; row < MAX_ROWS; row++) { // 初始化每一行的列 List<List<String>> currentRow = new ArrayList<>(MAX_COLS); for(int col = 0; col < MAX_COLS; col++) { currentRow.add(new ArrayList<String>()); } _stringSets.add(currentRow); } } // 元素读取示例 public List<String> get(int row, int col) { return _stringSets.get(row).get(col); } }
方案2:保留数组结构,显式压制警告
如果业务场景必须使用二维数组,你可以强制类型转换后压制编译警告,前提是你要自己保证后续所有对数组的赋值操作都不会写入非List<String>类型的元素,避免运行时类型错误:
import java.util.ArrayList; import java.util.List; public class Test { private static final int MAX_ROWS = 2; private static final int MAX_COLS = 5; private List<String> _stringSets[][]; @SuppressWarnings("unchecked") public Test() { // 强制转换后压制警告,需自行保证类型安全 _stringSets = (List<String>[][]) new List[MAX_ROWS][MAX_COLS]; for(int row = 0; row < MAX_ROWS; row++) { for(int col = 0; col < MAX_COLS; col++) { _stringSets[row][col] = new ArrayList<String>(); } } } }
内容的提问来源于stack exchange,提问作者Lauren_G
相关产品推荐
相关产品推荐

