我尝试在java中创建一个二维泛型数组。我没有编译错误,但在运行代码时出现异常:
Exception in thread "main" java.lang.ClassCastException: Cannot cast [[[Ljava.lang.String; to [[Ljava.lang.String;
at java.lang.Class.cast(Unknown Source)
at Tabela.<init>(Tabela.java:8)
at TabelaTest.main(TabelaTest.java:4)
以下是代码:
import java.lang.reflect.Array;
public class Tabela<T> {
private T[][] data;
public Tabela(Class<T[][]> c,int sizeX, int sizeY) {
this.data = c.cast(Array.newInstance(c.getComponentType(), sizeX, sizeY));
}
public void setInfoAt(T info, int x, int y) {
this.data[x][y] = info;
}
public T getObjectAt(int x, int y) {
return this.data[x][y];
}
}
public class TabelaTest {
public static void main(String args[]) {
Tabela<String> tabela = new Tabela<String>(String[][].class, 2, 2);
tabela.setInfoAt("a", 0, 0);
tabela.setInfoAt("b", 0, 1);
tabela.setInfoAt("c", 1, 0);
tabela.setInfoAt("d", 1, 1);
System.out.println(tabela.getObjectAt(1, 0));
}
}
看起来我不能将此方法用于二维数组。
编辑:
使用unholysampler中的方法现在可以正常工作。 构造函数已更改为:
public Tabela(Class<T> c,int sizeX, int sizeY) {
this.data = (T[][])Array.newInstance(c, sizeX, sizeY);
}
事情就是eclipse不断警告我这个演员(T [] [])。我可以压制它,但可以忽略吗?
答案 0 :(得分:6)
如果查看错误消息,您会看到方括号的数量不同。
Cannot cast [[[Ljava.lang.String; to [[Ljava.lang.String;
--- --
由于您调用Array.newInstance()
的方式,最终会得到额外的数组级别。如果您只想创建一个String
数组,可以使用:
String[] arr = (String[])Array.newInstance(String.class, 5);
请注意,您传入基类类型和方法&#34;添加&#34;一层括号。您的调用是说您需要一个包含String
的2D数组实例的数组。相反,您希望正常传入基类,然后指定维度。
Array.newInstance(String.class, sizeX, sizeY);
答案 1 :(得分:2)
此错误在您的构造函数中:
public Tabela(Class<T[][]> c,int sizeX, int sizeY) {
this.data = c.cast(Array.newInstance(c.getComponentType(), sizeX, sizeY));
}
c.getComponentType()
实际上是T[]
。 Array.newInstance(Class, int...)
返回一个与数组中的维度一样多的数组。传递两个值,数组是二维值。
Array.newInstance(
c.getComponentType(), // returns T[]
sizeX, sizeY
) // returns T[][][]
如果可能(类型擦除),那么它将是等同于new T[sizeX][sizeY][]
的运行时。
我会这样做:
public Tabela(Class<T> c,int sizeX, int sizeY) {
this.data = Array.newInstance(c, sizeX, sizeY);
}
答案 2 :(得分:1)
Array#newInstance(..)
州的javadoc
如果
componentType
表示数组类,则为维度数 新数组的总和等于dimensions.length
和的总和componentType
的维数。在这种情况下,组件 新数组的类型是componentType
的组件类型。
由于componentType
是一个数组类String[]
,因此维度数变为dimensions.length
,2
的总和以及{{1}的维度数},componentType
,总共1
。
您的电话
3
等同于
Array.newInstance(c.getComponentType(), sizeX, sizeY)
您可以将new String[2][2][]
方法调用为
newInstance(Class, int)
创建
Array.newInstance(c.getComponentType(), sizeX)
但你必须手动实例化嵌套数组。
或重构构造函数参数以实现unholysampler's solution。