创建具有2D通用数组字段的通用Java类

时间:2016-06-28 21:55:41

标签: java arrays generics runtime-error

我正在准备一个可以处理hexgrid的类。我正在尝试创建一个2D数组字段来保存该网格的数据。我准备了以下代码。它没有显示编译错误,但是有一个运行时错误。我是java编程的新手,不知道这是什么意思。

任何人都可以帮我解决错误或告诉我更好的解决方法吗?

Hex grid Class(HexGrid.java)

import java.lang.reflect.Array;

public class HexGrid <T>{
    int row,col;
    T[][] grid;

    public HexGrid(T[] data){
        int n = data.length;
        int r = (int) Math.ceil(Math.sqrt(n));
        LoadData(r, r, data);
    }       
    public HexGrid(int r,T[] data){
        this(r,(int)(Math.ceil(data.length/r)),data);
    }
    public HexGrid(int r){
        this(r,r,null);
    }
    public HexGrid(int r, int c){
        this(r,c,null);
    }
    public HexGrid(int r,int c,T[] data) {
        LoadData(r, c, data);           
    }

    @SuppressWarnings("unchecked")
    public void LoadData(int r, int c, T[] data){
        Class<? extends T> cls = (Class<? extends T>) data.getClass();
        row     = r;
        col     = c;
        grid    = (T[][]) Array.newInstance(data.getClass(),r, c+(int) Math.floor(r/2.0));
        if(data!=null)
            AssignValues(data);
    }

    private void AssignValues(T[] data) {
        int dbug=0;
        for(int i=0; i<row; i++)
        {
            for(int j= (int)(Math.ceil(i/2));j<col+(int)(Math.floor(row/2)); j++)
            {
                dbug++;
                if(dbug<data.length)
                     grid[i][j] = data[i];
                else grid[i][j] = null;
            }
        }
        System.out.println(dbug+"");
    }

}

以下是我希望如何使用它的示例示例(Test.java)

public class Test {

    public static void main(String[] args) {

        Integer[] data= new Integer[96];

        for(int i=0;i<96;i++)
            data[i] = i+1;

        HexGrid<Integer> objHexGrid = new HexGrid<Integer>(data);


    }

}

我收到的错误如下:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    at hexGrid.HexGrid.AssignValues(HexGrid.java:46)
    at hexGrid.HexGrid.LoadData(HexGrid.java:35)
    at hexGrid.HexGrid.<init>(HexGrid.java:13)
    at hexGrid.Test.main(Test.java:12)

1 个答案:

答案 0 :(得分:2)

问题是因为您分配了Integer[][][]数组,但将其用作Integer[][]

在以下行data.getClass()中返回Integer[],因此您分配了一个Integer[] - s的矩阵,而不是Integer - s:

grid = (T[][])Array.newInstance(data.getClass(),r, c+(int) Math.floor(r/2.0));

将以上行更改为:

grid = (T[][])Array.newInstance(
    data.getClass().getComponentType(), r, c + r / 2);