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