关于java ArrList中的泛型数组

在java中泛型具有泛型擦除的特质,在通过编译之后java将所有对象视为object类型,而对于Java的数组来说,他必须知道它持有的所有对象的具体类型,而泛型的这种运行时擦除机制违反了数组安全检查的原则。比如像下面的代码是报错的:

关于java ArrList中的泛型数组

但是我们可以先定义一个object类型的数组,再对引用的强制转换将其转为泛型数组

关于java ArrList中的泛型数组

这样虽然没有错误,但是似乎是没有意义的,因为所有Obiect的子类换句话说就是除了基本类型都可以存入这个数组中,没有实际的作用。

于是我们可以定义一个带有泛型的类

public class FanXing<T> {
	private T arr[];
	private int size;
	
	public FanXing(int size)
	{
		this.size=0;
		arr=(T[]) new Object[size];
	}
	
	public void add(T num)
	{
		arr[size]=num;
		size++;
	}
}

下面是对这个类的调用

关于java ArrList中的泛型数组

在类的实例化过程中我们可以定义泛型的类型,然后数组就强制转化为String类型的引用,往数组添加内容时发现,我们只可以添加String类型,而添加其他基本类型或者对象类型时就会报错。但是我们需要注意的是像开始所说的一样,我们的编译器只是卡了引用被强制转换的类型这一关,但是在编译通过后,java只知道他是一个Object类型而已。

观察源码后发现,实际上在Java原生的ArrayList类中,也是这样使用ArrayList数组的,使用类似的操作也会出现报错信息。

关于java ArrList中的泛型数组

PS:由于本人是初学者,以上只是在学习过程中的个人总结和思考,参考价值不大,如有错误,希望能够指正。

上一篇:JavaSE-18.3.2【案例-点名器】


下一篇:代码优化介绍