我希望重新发明轮子并在Java中创建我自己的通用数组支持列表类,类似于ArrayList。是的,我知道这很愚蠢,但这是一种学术上的追求。问题是您无法实例化泛型类型的数组
public class MySuperCoolList<E> {
E[] array;
public MySuperCoolList<E> () {
array = new E[10]; // ERROR: cannot do this!
}
}
肯定必须有一个解决这个问题的方法,因为Java的ArrayList正在做同样的事情。问题是,怎么样?如何实例化泛型类型E
的数组?它是如何在ArrayList中完成的(如果有人知道的话)?
答案 0 :(得分:4)
如何在ArrayList中完成(如果有人知道的话)?
它是开源的。看看source code for 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;
答案 1 :(得分:0)
在这种情况下,您可能希望使用对象类型数组,因为对象类型可以容纳所有内容,代码就像,
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;
}
}
答案 2 :(得分:0)
public MySuperCoolList<E>(final Class<? extends E> type) {
array = (E[]) Arrays.newInstance(type, 10);
}
见Arrays.newInstance
。这就是Arrays.copyOf
的工作原理。
我已经放置了PoC here。
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]