在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]