Java集合如Map、Set、List等全部集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据。java
使用反射能够破解泛型T类型,以下:spa
ArrayList<Integer> array=new ArrayList<Integer>(); array.add(1);//这样调用add方法只能存储整形,由于泛型类型的实例为Integer array.getClass().getMethod("add", Object.class).invoke(array, "asd"); //经过反射能够加入字符串类型
反射的使用:根据类名、方法名以及方法对应的参数,获取方法,并实现方法的调用。
调用getMethods方法输出的是自身的public方法和父类父接口的public方法。
调用getDeclaredMethods方法输出的是自身的public、protected、private、default方法。
泛型擦除概念:code
声明时的泛型擦除处理机制:blog
编译成.class文件时,会将.java文件中泛型作一些特殊处理:将类的泛型T去掉,将类中方法中的泛型T(方法参数和返回值T)变成Object,看下边例子,你就秒懂接口
//类中方法上的泛型
public T set(int index, T element) { public set(ILjava/lang/Object;)Ljava/lang/Object;
//类上的泛型
public class FXClass<T> implements List<T> { public class com/example/zs/fanxing/FXClass implements java/util/List {
引用时的泛型擦除处理机制:element
FXClass<Integer> list1 = new FXClass<Integer>(); list1.add(new Integer(10)); list1.add(new Integer(20)); Integer a =list1.get(0);//这行对应的字节码指令以下:
INVOKEVIRTUAL com/example/zs/fanxing/FXClass.get (I)Ljava/lang/Object;
CHECKCAST java/lang/Integer//这句指令的出现是由于源代码中使用了 (Integer a =)
划重点,我的理解:
1)get(0)得到的是Object类型,可是编译器看到咱们把Object类型赋值给了整形a,因此会生成一条指令CHECKCAST,字符串
运行时会检查Object能不能转成Integer类型,而且这条指令会抛异常呦。get
2)get(0)并无手动强转Integer,但编译器却能够调用Integer的方法。编译器