问提
ArrayList strList = new ArrayList<>(); 里面可以添加String类型吗?运行后会报错吗?
报错:
一般都是在编译时候进行报错。但是jvm运行时候不一定报错。因为jvm里面表示为Object的形式,只不过在编译成class文件时候会无法编译通过。那是不是如果我在编译时候通过了那就可以添加进去是吧;
ArrayList<Integer> strList = new ArrayList<>();
strList.add(1);
strList.add(2);
Class listClass = strList.getClass(); //得到 strList 对象的字节码 对象
//获取add()方法
Method m = listClass.getMethod("add", Object.class);
//调用add()方法
m.invoke(strList, "gg");
System.out.println(strList.toString());
//输出结果[1, 2, gg]
编译通过,运行时候也通过;同时也输出了不是Integer类型的值;
解析:
原因:在看完源码时候;add这个方法使用的是泛型E;同时E表示在类被初始化时候才把类型引入进去;但是在没有初始时候还是Object类型;反射是通过类去找方法的同时添加进去;所以只要是Object类型就行。但是Object又是最最基本类型。