在学习集合的时候,我们会接触到泛型。利用泛型,可以很好的控制集合中添加的数据。但是深入了解之后,会发现泛型只在编译时期起作用。而运行时期泛型会被擦除。
什么意思呢?举个简单的例子,坐火车要过安检。就相当于泛型的作用就相当于安检。只在进站的时候起作用,而你进去之后通过其它手段拿到了一些违禁品安检也管不到你。
假设已经有类Egg、Coke两个类。分别是鸡蛋、可乐。
先创建一个可乐瓶:
publicvoiddemo1(){//创建一个只能装可乐的可乐瓶List<Coke>cokeBottle=newArrayList<Coke>();}
然后尝试放鸡蛋进去:
Eggegg=newEgg();Cokecoke=newCoke();//添加可乐没有问题cokeBottle.add(coke;)//放入鸡蛋。这时候,这句代码会报错cokeBottle.add(egg);
因为泛型的关系,放鸡蛋的代码出错了。那么要怎么才能放鸡蛋呢?我们先获取cokeBottle(可乐瓶)编译后的Class对象:
Class<?extendsList>aClass=cokeBottle.getClass();
然后把添加可乐的方法找到:
Methodadd=aClass.getDeclaredMethod("add",Object.class);
然后再来放鸡蛋:
//因为是使用反射,这个时候泛型已经被擦除了。可以添加任何数据add.invoke(cokeBottle,egg);
这样就把鸡蛋放进去了,前面的代码是有异常的,大家可以自由抓或者抛。