前言
可能有一些读者跟我一样遇到这种问题,看看代码:
public class Node<T> {
T t;
Node<T> elem;
}
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Node<Student>[] nodes = new Node<>[10];
这里是两种类型一个是Node一个是Student,我们会发现最后一句报错了?看一下错误信息是,不能新建泛型类型数据数组。咦,为什么不可以呢?让我们来看看:
了解泛型擦除
首先要来了解一下泛型擦除。泛型是为指定一种容器的数据类型,例如规定乒乓球同只能放乒乓球,而不能放其他奇奇怪怪的东西,但这个约束是对于我们编程过程而言的,他约束我们在编程的时候不能往这个容器里面丢其他东西,但是对于编译器来说,在编译过程中,这些泛型都会被无视,编译器只认为他们都是Object类型。例如:
List<Student> list = new ArrayList<>();
这里我们指定了Student类型那么我们就不能放Person类型了,但是在编译过程中,编译器说:我管你什么泛型我统统擦除,所以对于他来说都是Object类型。所以泛型是对于我们编程过程来说,而对于编译过程是没有泛型这一说法的,都会被擦除了。
简述为什么
上面我们已经了解了泛型擦除了,那么也就很好理解了。因为我们新建数据首先要干嘛:开辟空间啊,但是,泛型对应的数据是不确定的,或者说对于编译而言全部都是Object,所以他会依照Object的大小去开辟空间,但是我们指定的泛型类型例如Student,String等等,他们的大小是不一致的,而且系统也不知道这块内存是要来放Object,而不管你是Student还是String,所以这个时候就会出错了。因为我们不能使用泛型类型的数据创建数组。