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