通过泛型和反射避免强制类型转换:
下面这个代码是没问题的。
Class clazz=Class.forName("java.util.Date");Date date= (Date) clazz.newInstance();
但是这样也没问题,编译器不会报错,但是run肯定会报错。
String string= (String) clazz.newInstance();
结合泛型反射可以避免强制类型转换,让编译器帮我们检查:
@SuppressWarnings(value = "unchecked")public class MainTest {public static void main(String args[]) throws Exception {Class<Date> clazz= (Class<Date>) Class.forName("java.util.Date");Date date=AFactory.getInstance(clazz);String string=AFactory.getInstance(clazz);}}class AFactory{public static<T> T getInstance(Class<T> clazz){try {return clazz.newInstance();}catch (Exception e){e.printStackTrace();System.out.println("wrong");return null;}}}

编译器不允许编译通过。
通过反射查看泛型信息。
获取普通的成员变量的信息:
public class MainTest {public static void main(String args[]) throws Exception {Class<Person> clazz=Person.class;Field field=clazz.getDeclaredField("name");Class<?> a=field.getType();System.out.println(a);}}class Person{private String name;}
打印:class java.lang.String
按上述方法获取泛型信息:
public class MainTest {public static void main(String args[]) throws Exception {Class<Person> clazz=Person.class;Field field=clazz.getDeclaredField("map");Class<?> a=field.getType();System.out.println(a);}}class Person{private Map<String,Integer> map;}
打印:java.util.Map,获取不到泛型String和Interger的信息。
可以如下:
public class MainTest {public static void main(String args[]) throws Exception {Class<Person> clazz=Person.class;Field field=clazz.getDeclaredField("map");Type type=field.getGenericType();System.out.println(type.getTypeName());if (type instanceof ParameterizedType){ParameterizedType parameterizedType= (ParameterizedType) type;Type rType=parameterizedType.getRawType();System.out.println("原始类型:"+rType);Type[] tArgs=parameterizedType.getActualTypeArguments();for (int i =0;i<tArgs.length;i++){System.out.println("第"+i+"个泛型类型是"+tArgs[i]);}}else {System.out.println("获取泛型类型出错");}}}class Person{private Map<Integer,String> map;}
打印:
java.util.Map<java.lang.Integer, java.lang.String>原始类型:interface java.util.Map第0个泛型类型是class java.lang.Integer第1个泛型类型是class java.lang.String
