结论:使用反射可以声明泛型数组,用到的类是java.lang.reflect包下的Array类。
先来看看泛型数组错误出现的代码
class Human<T,V> {
class Node{
T t;
V v;
}
private Node[] nodes;
public Human() {
nodes = new Node[10];
}
}
上面这段代码会报generic array creation错误,也就是泛型数组错误,Java中不允许声明泛型数组,因为泛型会在编译时被擦除,无法确定数组类型 ,例如ArrayList<String> arrayList = new ArrayList<>();
会在编译之后擦除掉String,关于泛型擦除问题可以自行搜索,这里不做过多解释。
那么有没有办法使用泛型数组呢?答案是有的,Java已经写好了相关的类,那就是java.lang.reflect.Array类,以下是代码案例。
import java.lang.reflect.Array;
class Human<T,V> {
class Node{
T t;
V v;
}
private Node[] nodes;
public Human() {
Node node = new Node();
Class c = node.getClass();//获取类的Class对象
this.nodes = (Node[])Array.newInstance(c,10);//通过Array类实例化泛型数组对象
//为数组中的每个元素分配一个对象
for (int i = 0; i < nodes.length; i++) {
nodes[i] = new Node();
}
}
public void list(){
for (int i = 0; i < nodes.length; i++) {
System.out.println(nodes[i]);
}
}
}
public class Test {
public static void main(String[] args) {
Human<Integer, Integer> human = new Human<>();
human.list();
}
}
结果如下:输出了human数组的10个元素