为什么需要泛型以及什么是泛型擦除?
- 编译期间检查错误,安全简洁;
- 避免过多的类型转换导致的运行时类型转换异常——更加安全
之前看了一个博客的评论,“Java的泛型是伪泛型”,
给的解释的Java泛型仅在编译期间生效,用来约束集合中数据的添加,使得java的集合更加安全,避免了过于自由带来的风险,避免存储元素类型不统一混乱;但是在运行期间则不存在,生成字节码的时候被替换掉,成为泛型擦除
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(111);
list.add(222);
list.add("Hello");//编译报错
如上面的代码实例:创建了一个数组集合泛型是Integer类型的,存储字符串“Hello”会立即报错,这是在编译期报错,淡当然了这种类型不匹配运行时肯定也会是报错的;
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(111);
list.add(222);
Class clazz = Class.forName("java.util.ArrayList");//获取ArrayList的字节码文件
Method m = clazz.getMethod("add", Object.class);//获取add() 方法,Object.class 代表任意对象类型的数据
m.invoke(list,"Hello");//通过反射添加字符串类型元素数据
System.out.println(list);//运行结果:[111, 222, Hello]
上面代码通过反射给Integer类型的数组集合添加了一个“Hello”字符串类型的数据并且正常的将数组打印了出来;
这是没有报错的;说明泛型只是在java的编译期会产生错误但是在java的运行期(已经生成字节码文件后)是会被擦除的,这个期间并没泛型的存在——这也成为泛型擦除。