0

我已经用java泛型类型解决了我的鼻毛问题。我正在尝试创建一个我可以乱用的通用 2D 数组(这是 90% 的实验,10% 对类等有用)。我对我得到的错误有点困惑。我理解它对我大喊大叫的话,但我不明白它们或如何解决它。这是代码:

private T[][] grid;
private int size;
private int hw;
private int r_curr = 0;
private int c_curr = 0;
private Class<T> currclass;

@SuppressWarnings("unchecked")
public Array2D(Class<T> type, int r){
    currclass = type;
    hw = r;
    size = r*r;
    int count = 0;

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    grid = (T[][]) Array.newInstance(type, r);
    //TODO: This is the bit where I get the following error
    //Exception in thread "main" java.lang.ClassCastException: 
    //[Ljava.lang.Boolean; cannot be cast to [[Ljava.lang.Object;
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    for(int i = 0; i < grid.length; i++){
        grid[i] = (T[]) Array.newInstance(type, r);
        for(int j = 0; j < grid.length; j++){
            grid[i][j] = null;
            count ++;
        }
    }
    if(!(size == count)){
        if(verbose){System.out.println("ALERT...Failed to successfully create array!");}
        grid = (T[][]) Array.newInstance(type, r);
    }
}

现在不要告诉我你在那里找到的其他损坏的东西(我确定它存在,哈哈),我还在写它,但泛型/铸造位让我难住了。

编辑:这是堆栈跟踪。这里真的没有太多。

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Boolean; cannot be cast to [[Ljava.lang.Object;
at mat.Array2D.<init>(Array2D.java:22)
at mat.BinMatrix.generateMatrix(BinMatrix.java:24)
at mat.BinMatrix.<init>(BinMatrix.java:9)
at mat.Test.main(Test.java:6)
4

3 回答 3

0

Array.newInstance(type, r):创建具有指定组件类型和长度的新数组。

似乎您正在传递typeas booleantonewInstance方法,然后尝试使用此语句中的强制转换将此布尔数组转换为 Object 数组:

grid = (T[][]) Array.newInstance(type, r);

这导致 ClassCastException

于 2013-09-06T04:09:19.437 回答
0

你可以使用:

  grid = (T[][]) Array.newInstance(currclass, r, r);

...得到你想要的二维数组。


要解释空间魔法,有两种Array.newInstance方法。一个采用单个大小值,并返回一个单维数组 - Array.newInstance(Class<?>, int)。另一个接受可变数量的大小值并返回一个多维数组 - Array.newInstance(Class<?>, int...)。第二个是我建议您使用的版本。

在此处的 Java 1.5.0 文档中有一些关于可变参数和数组之间关系的附加信息。特别是,这:

  grid = (T[][]) Array.newInstance(currclass, r, r);

相当于:

  grid = (T[][]) Array.newInstance(currclass, new int[] { r, r });

后者应该同样好地编译(和运行)。

于 2013-09-06T04:18:46.207 回答
0

您可以使用Array.newInstance()具有多个维度的形式。但请注意,该方法并不神奇。它只是一维数组创建的一种方便方法,它也初始化子数组。

就像正常的多维数组创建一样:

Boolean[][] foo = new Boolean[r][r];

是语法糖:

Boolean[][] foo = new Boolean[r][];
for (int i = 0; i < r; i++)
    foo[i] = new Boolean[r];

多维度Array.newInstance()

grid = (T[][]) Array.newInstance(currclass, r, r);

也可以写成一维的Array.newInstance()

Class currArrayClass = Array.newInstance(currclass, 0).getClass();
grid = (T[][]) Array.newInstance(currArrayClass, r);
for (int i = 0; i < r; i++)
    grid[i] = (T[]) Array.newInstance(currclass, r);
于 2013-09-06T09:47:29.490 回答