3.2 验证实例:
- public class GenericTest {
- public static void main(String[] args) {
- new GenericTest().testType();
- }
- public void testType(){
- ArrayList<Integer> collection1 = new ArrayList<Integer>();
- ArrayList<String> collection2= new ArrayList<String>();
-
- System.out.println(collection1.getClass()==collection2.getClass());
- //两者class类型一样,即字节码一致
-
- System.out.println(collection2.getClass().getName());
- //class均为java.util.ArrayList,并无实际类型参数信息
- }
- }
输出结果:
- true
- java.util.ArrayList
分析:
这是因为不管为泛型的类型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一类处理,在内存中也只占用一块内存空间。从Java泛型这一概念提出的目的来看,其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。
在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。由于系统中并不会真正生成泛型类,所以instanceof运算符后不能使用泛型类
4、泛型与反射
把泛型变量当成方法的参数,利用Method类的getGenericParameterTypes方法来获取泛型的实际类型参数
例子:
- public class GenericTest {
- public static void main(String[] args) throws Exception {
- getParamType();
- }
-
- /*利用反射获取方法参数的实际参数类型*/
- public static void getParamType() throws NoSuchMethodException{
- Method method = GenericTest.class.getMethod("applyMap",Map.class);
- //获取方法的泛型参数的类型
- Type[] types = method.getGenericParameterTypes();
- System.out.println(types[0]);
- //参数化的类型
- ParameterizedType pType = (ParameterizedType)types[0];
- //原始类型
- System.out.println(pType.getRawType());
- //实际类型参数
- System.out.println(pType.getActualTypeArguments()[0]);
- System.out.println(pType.getActualTypeArguments()[1]);
- }
- /*供测试参数类型的方法*/
- public static void applyMap(Map<Integer,String> map){
- }
- }
输出结果:
- java.util.Map<java.lang.Integer, java.lang.String>
- interface java.util.Map
- class java.lang.Integer
- class java.lang.String
通过反射绕开编译器对泛型的类型限制
- public static void main(String[] args) throws Exception {
- //定义一个包含int的链表
- ArrayList<Integer> al = new ArrayList<Integer>();
- al.add(1);
- al.add(2);
- //获取链表的add方法,注意这里是Object.class,如果写int.class会抛出NoSuchMethodException异常
- Method m = al.getClass().getMethod("add", Object.class);
- //调用反射中的add方法加入一个string类型的元素,因为add方法的实际参数是Object
- m.invoke(al, "hello");
- System.out.println(al.get(2));
- }
5 泛型的限制
5.1 模糊性错误
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|