【泛型擦除】

为什么需要泛型以及什么是泛型擦除?

  1. 编译期间检查错误,安全简洁;
  2. 避免过多的类型转换导致的运行时类型转换异常——更加安全
    之前看了一个博客的评论,“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的运行期(已经生成字节码文件后)是会被擦除的,这个期间并没泛型的存在——这也成为泛型擦除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值