如果要创建具有类型安全性的数组,只需执行以下操作。不确定每个人从哪里得到你做不到的概念:
import java.lang.reflect.Array;
public class Array2D<T> {
private T[][] data;
public Array2D(Class<T> clazz, int width, int height) {
this.data = (T[][]) Array.newInstance(clazz, width, height);
}
public void putValue(int x, int y, T value) {
data[x][y] = value;
}
public T getValue(int x, int y) {
return data[x][y];
}
public static void main(String[] args) {
Array2D<String> myStuff = new Array2D<String>(String.class, 10, 10);
myStuff.putValue(3, 4, "Helloworld!");
System.out.println(myStuff.getValue(3, 4));
}
}
输出:
你好世界!
编辑:
如果您需要更高的性能,请考虑使用一维数组并将其视为 n 维数组。这是使用 android 设备时已知的改进,但前提是您不断访问数组。
此外,您可以强制调用者创建数组并完全避免使用反射。但是,除非您经常创建这些数组,否则不会产生显着差异,当 JVM 优化调用时更是如此。
import java.lang.reflect.Array;
public class Array2D<T> {
private T[] data;
private final int height;
private final int width;
public Array2D(Class<T> clazz, int width, int height) {
// Using 1D array instead of 2D array
this((T[]) Array.newInstance(clazz, width * height), width, height);
}
public Array2D(T[] data, int width, int height) {
this.data = data;
this.width = width;
this.height = height;
}
public void putValue(int x, int y, T value) {
data[x * width + y] = value;
}
public T getValue(int x, int y) {
return data[x * width + y];
}
public static void main(String[] args) {
Array2D<String> myStuff = new Array2D<String>(String.class, 10, 10);
myStuff.putValue(3, 4, "Helloworld!");
System.out.println(myStuff.getValue(3, 4));
// Force the caller to create the array
Array2D<String> myOtherStuff = new Array2D<String>(new String[5 * 10], 5, 10);
myOtherStuff.putValue(2, 7, "Goodbyeworld!");
System.out.println(myOtherStuff.getValue(2, 7));
}
}