在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
privatestaticvoiddataType(Result<?> result)throws NoSuchFieldException { Field field = result.getClass().getDeclaredField("data"); System.out.println(field.getType().toString()); }
}
/* 输出: class java.lang.Object class java.lang.Object */
privatestaticvoiddataType(Result<?> result)throws NoSuchFieldException { Field field = result.getClass().getDeclaredField("data"); System.out.println(field.getType().toString()); }
}
/* 输出: class java.lang.Number class java.lang.Number */
publicstaticvoidmain(String[] args)throws Exception { ArrayList<Integer> list = new ArrayList<Integer>(); //正规途径 list.add(1); //反射大法 Method m = list.getClass().getMethod("add", Object.class); m.invoke(list, 2); m.invoke(list, 3.21); m.invoke(list, "对不起,我是字符串"); m.invoke(list, new Date()); for (Integer x : list) { System.out.println(x.getClass().getName() + ":\t" + x); } } }
/* 输出: java.lang.Integer: 1 java.lang.Integer: 2 Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer at Main.main(Main.java:20) */