在java中泛型具有泛型擦除的特质,在通过编译之后java将所有对象视为object类型,而对于Java的数组来说,他必须知道它持有的所有对象的具体类型,而泛型的这种运行时擦除机制违反了数组安全检查的原则。比如像下面的代码是报错的:
![]()
但是我们可以先定义一个object类型的数组,再对引用的强制转换将其转为泛型数组
![]()
这样虽然没有错误,但是似乎是没有意义的,因为所有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++;
}
}
下面是对这个类的调用

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

PS:由于本人是初学者,以上只是在学习过程中的个人总结和思考,参考价值不大,如有错误,希望能够指正。
Java泛型与数组安全
本文探讨了Java泛型在数组应用中的局限性及其原因,介绍了如何定义泛型类并安全地使用泛型数组。
380

被折叠的 条评论
为什么被折叠?



