我已经了解了我的鼻毛与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)
答案 0 :(得分:0)
Array.newInstance(type, r)
:创建一个具有指定组件类型和长度的新数组。
您似乎正在将type
作为boolean
传递给newInstance
方法,然后尝试使用此语句中的强制转换将此布尔数组转换为Object数组:
grid = (T[][]) Array.newInstance(type, r);
导致ClassCastException
答案 1 :(得分:0)
您可以使用:
grid = (T[][]) Array.newInstance(currclass, r, r);
...得到你想要的2D阵列。
为了解释太空魔法,有两种Array.newInstance
方法。一个采用单个大小值,并返回单个维度数组 - Array.newInstance(Class<?>, int)
。另一个采用可变数量的大小值并返回多维数组 - Array.newInstance(Class<?>, int...)
。第二个是我建议你使用的版本。
Java 1.5.0文档here中有关于varargs和数组之间关系的一些其他信息。特别是:
grid = (T[][]) Array.newInstance(currclass, r, r);
相当于:
grid = (T[][]) Array.newInstance(currclass, new int[] { r, r });
后者应该同样好地编译(和功能)。
答案 2 :(得分: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);