泛型擦除
最近,在网上看到一个问题,用反射可以在声明泛型为String的list中插入一个int数值;看到之后感到很有意思,就去查了下资料,然后聊作整理。
什么是List泛型擦除,为什么反射能够在ArrayList< String >中添加int类型呢??
首先:泛型的作用层在编译时,而在运行时泛型会被擦除。
其次:而反射在运行时获取到list的add方法,直接在运行时添加了数据,跳过了编译期。
在ArrayList 中的Integer数据类型只是为了数据安全,将数据规范后给编译器识别真正在运行的时候,仍然是Object.
package generic;
import java.lang.reflect.Method;
import java.util.ArrayList;
//泛型在编译时有效,运行时无效
public class TestGeneric01 {
public static void main(String[] args) throws Exception{
ArrayList<String> list=new ArrayList<>();
list.add("A");
list.add("B");
list.add("Hello World");
//list.add(200);
//基于反射技术,将数值型200写入list集合中
//获取类对象
Class<?> cls = list.getClass(); //获取list的具体类型
//获取类中的方法对象
Method m = cls.getDeclaredMethod("add", Object.class); //获取类中的add方法,参数类型为Object类型
//执行方法对象
m.invoke(list, 200);
m.invoke(list, true);
System.out.println(list);
}
}
运行结果 :
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
i·Space !
喜欢就支持一下吧
打赏
微信
支付宝