泛型擦除,教你怎么用可乐瓶装鸡蛋

在学习集合的时候,我们会接触到泛型。利用泛型,可以很好的控制集合中添加的数据。但是深入了解之后,会发现泛型只在编译时期起作用。而运行时期泛型会被擦除。

什么意思呢?举个简单的例子,坐火车要过安检。就相当于泛型的作用就相当于安检。只在进站的时候起作用,而你进去之后通过其它手段拿到了一些违禁品安检也管不到你。

假设已经有类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);

这样就把鸡蛋放进去了,前面的代码是有异常的,大家可以自由抓或者抛。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章