以下说法错误的是()
List<String> list = new ArrayList<String>();//这里后面加不加String都是一样的,编译时会自动擦除: Class clazz = list.getClass(); Type genType = clazz.getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (!(params[0] instanceof Class)) { System.out.println("无法获得类型"); }else{ System.out.println(((Class)params[0]).getName()); }输出结果:无法获得类型
List<String> list = new ArrayList<String>(){ //这里必须指明String类型,创建一个匿名类实现泛型接口 }; Class clazz = list.getClass(); ...同上输出结果:java.lang.String
public static void main(String[] args) throws IllegalAccessException, InstantiationException { List<String> a = new ArrayList<>(); Class<? extends List> aClass = a.getClass(); ParameterizedType genericSuperclass = (ParameterizedType)aClass.getGenericSuperclass(); Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments(); for (int i = 0;i <actualTypeArguments.length;i++) System.out.println(actualTypeArguments[i]); }
/* 通过反射在运行时动态获取List<t>中T的实际类型 */ public class GetGeneric { public List<String> list; public static void main(String[] args) throws NoSuchFieldException, SecurityException { Type t = GetGeneric.class.getDeclaredField("list").getGenericType(); if (ParameterizedType.class.isAssignableFrom(t.getClass())) { for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) { System.out.print(t1); } } } }