我有一个泛型类型,它在构造函数中提供了 Class<T>
对象。我想在这个构造函数中创建二维数组 T[][]
,不知道是否可能?
我有一个泛型类型,它在构造函数中提供了 Class<T>
对象。我想在这个构造函数中创建二维数组 T[][]
,不知道是否可能?
与如何在Java中创建通用数组?相同,但对2D进行了扩展:
import java.lang.reflect.Array;
public class Example <T> {
private final Class<? extends T> cls;
public Example (Class<? extends T> cls) {
this.cls = cls;
}
public void arrayExample () {
// a [10][20] array
@SuppressWarnings("unchecked")
T[][] array = (T[][])Array.newInstance(cls, 10, 20);
System.out.println(array.length + " " + array[0].length + " " + array.getClass());
}
public static final void main (String[] args) {
new Example<Integer>(Integer.class).arrayExample();
}
}
T[] array = (T[])Array.newInstance(cls, d1);
T[][] array = (T[][])Array.newInstance(cls, d1, d2);
T[][][] array = (T[][][])Array.newInstance(cls, d1, d2, d3);
T[][][][] array = (T[][][][])Array.newInstance(cls, d1, d2, d3, d4);
T[][][][][] array = (T[][][][][])Array.newInstance(cls, d1, d2, d3, d4, d5);
Array.newInstance()
以获取详细信息。T[][]
(或其他)。cls
可能是一个原始类型。 - newacctnew Example<Integer>(int.class)
的操作才能达到那个地步,这可能有点奇怪,但是没错,你是正确的。我有机会会进行更新。 - Jason CarrayExample()
中检查 cls == int.class
并添加一个特殊情况,对于其他原始类型也可以这样做,但是这会导致维护一堆重复代码的噩梦。问题归结为无法将泛型转换为原始类型。因此,虽然如果 cls
是原始类型的类,则示例会失败,但我认为这不值得关注(个人意见)--解决方法是使用对象类型而不是原始类型。 - Jason CObject
而不是特定类型的数组。或者至少,多维数组的最后一级必须替换为Object
。(因此,二维数组可以安全地表示为Object[]
;一维数组只能表示为Object
。) - newacct