一开始我也不知道原因的,但测试了不同的类,查找方法,最后终于找到了一个比较合理的解释。请看代码:[code=java]package heima.answer;
import java.util.ArrayList;
public class Test5 {
public static void main(String[] args) throws Exception{
//下面是:case1
// ArrayList<Integer> alist = new ArrayList<Integer>();
//
// //通过反射将只能存储类型变量为Integer的集合中存储字符串
// alist.getClass().getMethod("add", Object.class).invoke(alist, "abc");
// System.out.println(alist.get(0));//输出 :abc
// System.out.println(alist.get(0).TYPE); //运行到该步时抛出如下异常:
// //Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
//下面是:case2
ArrayList<String> aList = new ArrayList<String>();//经测试发现,只有当泛型结合中装的是String时,比较奇怪一些,而其他基本数据类型的包装类不会发生类型转换异常
aList.getClass().getMethod("add",Object.class).invoke(aList,"abc");
aList.getClass().getMethod("add",Object.class).invoke(aList,123);
System.out.println(aList.get(0));//正常输出abc
System.out.println(aList.get(1));//抛出类型转换异常
/*上面的打印输出如下:
Exception in thread "main" abc
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at heima.answer.Test5.main(Test5.java:23)
*/
System.out.println(aList.get(1).TYPE);
/*这个语句报错了,说明语句通不够编译器。证明了String类没有枚举常量Sting.TYPE,
*
case2中的 System.out.println(aList.get(1)); 与 case2中的 System.out.println(aList.get(1).TYPE);这两个语句执行结果一样,说明
了打印String的时候,会自动对比该打印的类型是否是String类型,而Integer等类型因为有枚举常量TYPE,所以不会自动对比所打印的类型,但当我们调用它的类型时候,系统会
抛出异常,因为系统已经知道了你要打印的是Integer类型的数据,而你通过反射传入泛型集合的是String类型的数据(见case1),二者不统一,所以报错。
*/
/**
* 经查API发现,基本数据的包装类都有TYPE字段,表示的是该类的一个实例。而String类则没有TYPE。
*
字段摘要
static int MAX_VALUE
值为 231-1 的常量,它表示 int 类型能够表示的最大值。
static int MIN_VALUE
值为 -231 的常量,它表示 int 类型能够表示的最小值。
static int SIZE
用来以二进制补码形式表示 int 值的比特位数。
static Class<Integer> TYPE
表示基本类型 int 的 Class 实例。
*
*
(下面是TYPE的定义)
TYPE
public static final Class<Integer> TYPE表示基本类型 int 的 Class 实例。
从以下版本开始:
JDK1.1
*
*
*/
}
}[/code][color=Red]欢迎其他童鞋继续探讨该题,我给出的只是一个参考的答案,也许是错的,欢迎你推翻我的推理。[/color] |