在Java中生成泛型列表的2D数组
所以-我想制作一个包含我感兴趣的数据的二维通用列表数组(在一个具有一定大小的网格上)在Java中生成泛型列表的2D数组,java,arrays,list,2d,Java,Arrays,List,2d,所以-我想制作一个包含我感兴趣的数据的二维通用列表数组(在一个具有一定大小的网格上) private ArrayList[][]gridData; 当我初始化这个数组时 gridData = (ArrayList<MyDataStruct>[][])new ArrayList[w][h]; for(int x=0; x<w; x++) for(int y=0; y<h; y++){ gridData[x][y] = (ArrayList<M
private ArrayList[][]gridData;
当我初始化这个数组时
gridData = (ArrayList<MyDataStruct>[][])new ArrayList[w][h];
for(int x=0; x<w; x++)
for(int y=0; y<h; y++){
gridData[x][y] = (ArrayList<MyDataStruct>)new ArrayList<MyDataStruct>(0);
//other stuff, i.e. get data from somewhere, etc
}
gridData=(ArrayList[])新的ArrayList[w][h];
对于(int x=0;x而言,唯一的类型安全选项是使用嵌套列表
由于类型擦除,您无法执行new ArrayList[w][h]
,因为这基本上变成了new ArrayList[w][h]
…而且事情变得复杂、毛茸茸、快速,因为数组的行为不像泛型
Java认为String[]
是Object[]的子类
,但ArrayList
不是ArrayList
的子类。通常,当您试图将元素放入与数组的真实类型不匹配的数组时,数组会抛出ArrayStoreException
,但由于类型擦除,当图中有泛型时,它无法执行此操作
Josh Bloch用有效的Java语言给出了以下示例:
// Why generic array creation is illegal - won't compile!
List<String>[] stringLists = new List<String>[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList;
String s = stringLists[0].get(0);
//为什么泛型数组创建是非法的-不会编译!
List[]StringList=新列表[1];
List intList=Arrays.asList(42);
对象[]对象=字符串列表;
对象[0]=intList;
字符串s=StringList[0]。获取(0);
防止所有这些代码在Java中完全合法的唯一方法是禁止泛型数组创建,或者至少将其标记为不安全
这就是说,在我看来,键入列表并使用通用列表的适度开销绝对值得使用类型安全性。我是带着同样的问题来到这里的(只是一些实验,“完成事情”方法)。
这里有一个似乎对我有效的解决方案,使用反射
请注意,它对数组中的单元格类型是100%不可知的(可以是列表、映射或任何形式)。也许再多做一点工作,它也可以对数组的#维度不可知,但我今天有更大的事情要做
private static <T> T[][] makeArray(Class<T> componentType, int... dimentions) {
return (T[][]) Array.newInstance(componentType, dimentions);
}
@assylias:因为它不可编译。甚至不可关闭。泛型和数组在Java中就是不能像那样工作。所以我想只要我使用数组,我就会一直受到警告的困扰?它是“安全”的,因为我知道我应该放什么和从中得到什么。但是tbh,我甚至想不出我的代码会是类型不安全的(所以你的意思是,如果我决定在我的2d数组中放入一个非泛型类型MyDataStruct的列表,Java将无法解决这个问题。)这或多或少是正确的。我添加了一个来自Josh Bloch的高效Java的示例,如果有帮助的话。
private static <T> T[][] makeArray(Class<T> componentType, int... dimentions) {
return (T[][]) Array.newInstance(componentType, dimentions);
}
@Test
public void testMakeArray() throws Exception {
@SuppressWarnings("unchecked")
List<String>[][] arr = makeArray(List.class, 2, 3);
Assert.assertEquals(2, arr.length);
Assert.assertEquals(3, arr[0].length);
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = Arrays.asList("cell", "r="+i, "c="+j);
System.out.print(arr[i][j] + "\t");
}
System.out.println("");
}
}
[cell, r=0, c=0] [cell, r=0, c=1] [cell, r=0, c=2]
[cell, r=1, c=0] [cell, r=1, c=1] [cell, r=1, c=2]