我尝试在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)
Run Code Online (Sandbox Code Playgroud)
这是代码:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
看起来我不能将此方法用于二维数组.
编辑:
使用unholysampler中的方法现在可以正常工作.构造函数已更改为:
public Tabela(Class<T> c,int sizeX, int sizeY) {
this.data = (T[][])Array.newInstance(c, sizeX, sizeY);
}
Run Code Online (Sandbox Code Playgroud)
事情就是eclipse不断警告我这个演员(T [] []).我可以压制它,但是可以忽略它吗?
如果查看错误消息,您将看到方括号的数量不同.
Cannot cast [[[Ljava.lang.String; to [[Ljava.lang.String;
--- --
Run Code Online (Sandbox Code Playgroud)
由于你的调用方式,你最终会得到额外的数组级别Array.newInstance().如果您只想创建一个String数组,您可以使用:
String[] arr = (String[])Array.newInstance(String.class, 5);
Run Code Online (Sandbox Code Playgroud)
请注意,您传入基类类型,方法"添加"一个括号层.你的电话是说你想要一个包含二维数组实例的数组String.相反,您只想正常传入基类,然后指定维度.
Array.newInstance(String.class, sizeX, sizeY);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
970 次 |
| 最近记录: |