【问题标题】:2D Array creation of generics2D Array 创建泛型
【发布时间】:2016-04-26 13:30:42
【问题描述】:

我想创建一个 (10x10) 二维泛型数组的实例:

objArray<T>[][] = new T[10][10]

显然,由于java's type erasure,这不起作用。

我发现这个解决方法建议for a 1D array,类似于:

// a generic class with a method to create an array of the parameterised type
public class GenericArrayTest<T>{

  // declare the class instance
  private Class<T> tClass;

  // code to initialise tClass

  // returns an array of the parameterised type
  public <T> T[] returnArray(){
    return (T[])java.lang.reflect.Array.newInstance(tClass, 10);
  }

}

这适用于一维数组,但是当我为二维数组修改它时:

  public <T> T[][] returnArray(){
    return (T[][])java.lang.reflect.Array.newInstance(tClass, 10, 10);
  }

第二个维度为空。也就是说,填充了 T[1-10],但 T[][1-10] 为空。任何人都可以提出解决此问题的提示吗?如果没有直接的方法,我可能会硬着头皮在我的应用程序中摆脱泛型:(

编辑:*******

以下有用的答案让我得出了答案。我的数组声明确实工作正常,但这只会设置一个空的内存块。必须为数组中的每个值实例化一个对象:

for (int i=0; i<10; i++){
    for (int j=0; j<10; j++){                
         myarray[i][j] = this.tClass.newInstance();

【问题讨论】:

  • "谁能提出解决这个问题的建议?"不混合泛型和数组。他们真的玩得不好(例如,如果 TList&lt;String&gt; 怎么办?)

标签: java arrays generics


【解决方案1】:

当然它们是空的,该方法应该把哪些实例放在那里?

数组只不过是一系列保留的内存地址。 T[1-10][] 部分使用 T[] 类型的数组实例进行初始化。 T[][1-10] 是指向对象的指针数组 - 它们为空。您仍然必须使用实例填充它。

一维数组

  • T[0] -> 空
  • T[1] -> 空

二维数组

  • T[0] -> T[] {null, null,null, null ...}
    • T[0][0] -> 空
    • T[0][1] -> 空

【讨论】:

  • 嗯,谢谢。那讲得通。对用实例填充它的语法有什么想法吗?说每个元素 [i][j] 我想要一个新的 tClass()
  • 谢谢,我想通了:
【解决方案2】:
public class GenericArrayTest<T>{   

    private final Class<T> cls; 

    public GenericArrayTest (Class<T> cls) {
        this.cls = cls;
    }

    public <T> T[][] returnArray(){
    T[][] array = (T[][])Array.newInstance(cls,30,40);
    return array;
    }

我已对您的代码进行了一些更改,这可能会对您有所帮助。检查这个

【讨论】:

  • 谢谢,这更干净了。所以我不必使用反射?
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多