学习笔记之java为什么不能新建泛型类型数据数组?

前言

可能有一些读者跟我一样遇到这种问题,看看代码:

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,所以这个时候就会出错了。因为我们不能使用泛型类型的数据创建数组。

猜你喜欢

转载自blog.csdn.net/weixin_43766753/article/details/101620882