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

我尝试用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));
    }
}
线程“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数组。