0

我希望重新发明轮子,并在 Java 中创建自己的通用数组支持列表类,类似于 ArrayList。是的,我知道这很愚蠢,但这是一种学术追求。问题是您无法实例化泛型类型的数组

public class MySuperCoolList<E> {
   E[] array;

   public MySuperCoolList<E> () {
      array = new E[10]; // ERROR: cannot do this!
   }
}

这个问题肯定有解决方案,因为 Java 的 ArrayList 也在做同样的事情。问题是,怎么做?如何实例化泛型类型的数组E?它是如何在 ArrayList 中完成的(如果有人知道的话)?

4

3 回答 3

4

它是如何在 ArrayList 中完成的(如果有人知道的话)?

它是开源的。看看源代码ArrayList

/**
 * The array buffer into which the elements of the ArrayList are stored.
 * The capacity of the ArrayList is the length of this array buffer.
 */
private transient Object[] elementData;
于 2012-08-27T23:05:38.977 回答
0

在这种情况下,您可能想使用 Array of Object Type ,因为对象类型可以容纳所有内容,代码如下:

public class MySuperCoolList<E> {
    Object[] array;

    public MySuperCoolList () {
       array = new Object[10];
    }

    public E get(int index){
       return (E) array[index];
    }

    public void put(int index,E val) {
      array[index] = val;
    }

}
于 2012-08-27T23:06:39.530 回答
0
public MySuperCoolList<E>(final Class<? extends E> type) {
  array = (E[]) Arrays.newInstance(type, 10);
}

Arrays.newInstance。这是如何Arrays.copyOf工作的。

我在这里放置了一个 PoC 。

int[] vals = (int[]) Array.newInstance(Integer.TYPE, 10);
vals[0] = 500;
System.out.println(vals);
System.out.println(vals.length);
System.out.println(Arrays.toString(vals));

如您所见,输出符合预期:

[I@fb53f6
10
[500, 0, 0, 0, 0, 0, 0, 0, 0, 0]
于 2012-08-27T23:12:02.260 回答