Java 二维通用数组初始化
我尝试用java创建一个二维通用数组。我没有收到编译错误,但在运行代码时出现异常:Java 二维通用数组初始化,java,Java,我尝试用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.m
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));
}
}
线程“main”java.lang.ClassCastException中的异常:无法将[[[Ljava.lang.String;转换为[[Ljava.lang.String;
位于java.lang.Class.cast(未知源)
在Tabela。(Tabela.java:8)
在TabelaTest.main(TabelaTest.java:4)
代码如下:
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));
}
}
import java.lang.reflect.Array;
公共类Tabela{
私有T[][]数据;
公共选项卡(c类,int-sizeX,int-sizeY){
this.data=c.cast(Array.newInstance(c.getComponentType(),sizeX,sizeY));
}
公共void setInfoAt(T info,int x,int y){
此。数据[x][y]=信息;
}
公共T getObjectAt(整数x,整数y){
返回此。数据[x][y];
}
}
公共类TabelaTest{
公共静态void main(字符串参数[]){
Tabela Tabela=新Tabela(字符串[][].class,2,2);
tabela.setInfoAt(“a”,0,0);
tabela.setInfoAt(“b”,0,1);
表1.setInfoAt(“c”,1,0);
表1.setInfoAt(“d”,1,1);
System.out.println(tabela.getObjectAt(1,0));
}
}
看起来我不能对二维数组使用这种方法
编辑:
使用邪恶采样器的方法,它现在可以工作了。
构造函数已更改为:
public Tabela(Class<T> c,int sizeX, int sizeY) {
this.data = (T[][])Array.newInstance(c, sizeX, sizeY);
}
public选项卡(c类,int-sizeX,int-sizeY){
this.data=(T[][])Array.newInstance(c、sizeX、sizeY);
}
问题是eclipse一直在警告我这个cast(T[][])。我可以抑制它,但是忽略它可以吗?javadoc of states
如果componentType
表示数组类,则表示维度数
新数组的长度等于维度的和。长度和
组件类型
的维度数。在这种情况下,组件
新数组的类型是componentType
的组件类型
由于componentType
是String[]
数组类,因此维数成为维数的总和。长度,2
,以及componentType
,1
的维数,总计3
你的电话
Array.newInstance(c.getComponentType(), sizeX, sizeY)
相当于
new String[2][2][]
相反,您可以调用newInstance(Class,int)
方法
Array.newInstance(c.getComponentType(), sizeX)
创建
new String[2][]
但是您必须手动实例化嵌套数组
或者重构构造函数参数以实现。此错误在构造函数中:
public Tabela(Class<T[][]> c,int sizeX, int sizeY) {
this.data = c.cast(Array.newInstance(c.getComponentType(), sizeX, sizeY));
}
如果可能的话(类型擦除),这将是一个相当于newt[sizeX][sizeY][
的运行时
我会这样做:
public Tabela(Class<T> c,int sizeX, int sizeY) {
this.data = Array.newInstance(c, sizeX, sizeY);
}
public选项卡(c类,int-sizeX,int-sizeY){
this.data=Array.newInstance(c、sizeX、sizeY);
}
如果查看错误消息,您会发现方括号的数量不同
Cannot cast [[[Ljava.lang.String; to [[Ljava.lang.String;
--- --
由于调用array.newInstance()
的方式,您最终将获得额外的数组级别。如果您只想创建字符串
数组,您可以使用:
String[] arr = (String[])Array.newInstance(String.class, 5);
请注意,传入基类类型,方法“添加”一层括号。您的调用表示需要一个包含String
二维数组实例的数组。相反,您只需正常传入基类,然后指定维度
Array.newInstance(String.class, sizeX, sizeY);
很抱歉,我没有真正理解。据我所知,您是说我需要用t而不是t[][]调用Array.newInstance?是的。因为Array.newInstance为您创建2D数组。